IEnumerable 没有 Count 方法

Posted

技术标签:

【中文标题】IEnumerable 没有 Count 方法【英文标题】:IEnumerable doesn't have a Count method 【发布时间】:2011-02-09 04:46:27 【问题描述】:

我有以下方法:

public bool IsValid

  get  return (GetRuleViolations().Count() == 0); 


public IEnumerable<RuleViolation> GetRuleViolations()
  //code here

为什么我在上面做.Count() 的时候会用红色下划线?

我收到以下错误:

错误 1 ​​'System.Collections.Generic.IEnumerable' 不包含定义 '计数',没有扩展方法 'Count' 接受第一个参数 类型 'System.Collections.Generic.IEnumerable' 可以找到(您是否缺少 使用指令或程序集 参考?) c:\users\a\documents\visual 工作室 2010\Projects\NerdDinner\NerdDinner\Models\Dinner.cs 15 47 NerdDinner

【问题讨论】:

有同样的问题。由于某种原因,您不能右键单击它并选择“解决...”来修复它:( 叹息!我包含了 System.Linq,但仍然出现此错误。 (虽然他的错误消息将第一个参数命名为“System.Linq.IQueryable”。) 一般注意事项:注意 .Count() 的缺点 - 不要随意使用它!我已经在***.com/a/65112753/863651下面的评论中写到了它,请随时查看它 【参考方案1】:

你添加:

using System.Linq;

在您的源代码的顶部,并确保您有对 System.Core 程序集的引用。

Count()System.Linq.Enumerable 静态类为 LINQ to Objects 提供的扩展方法,System.Linq.Queryable 为 LINQ to SQL 和其他进程外提供程序提供。

编辑:实际上,在这里使用Count() 效率相对较低(至少在LINQ to Objects 中)。您只想知道是否有 any 元素,对吗?在这种情况下,Any() 更合适:

public bool IsValid

  get  return !GetRuleViolations().Any(); 

【讨论】:

如果此引用给您一个错误,请验证您的项目的目标框架(在项目属性,应用程序选项卡中)设置为 .NET Framework 3.5 或 4。扩展方法将不起作用2.0 或更早版本。 我使用过 System.Linq;但它不能解决我的问题...如何确保我得到了对 System.Core 程序集的引用? 哦,没关系,我修好了... System.data.linq 和 System.Linq 有什么不同 @Alexander:它们是完全不同的命名空间。 System.Data.Linq 特定于 LINQ to SQL。 @skyfoot:不,真的不会。它会给你 4。如果你不这么认为,请发布一个问题,其中包含一个简短但完整的程序来演示该问题。【参考方案2】:

Linq 中的Any()Count() 方法仅适用于泛型类型。

IEnumerable<T>

如果你有一个没有类型的简单IEnumerable,请尝试使用

IEnumerable<object> 

改为。

【讨论】:

【参考方案3】:

IEnumeration 没有名为Count() 的方法。它只是一种“元素序列”。例如,如果您明确需要元素数量,请使用 List。 如果您使用 Linq 请记住,扩展方法 Count() 实际上可能会在您每次调用它时重新计算元素的数量。

【讨论】:

【参考方案4】:

A short & sweet general word of caution on the pitfalls of .Count() 来帮助那些在未来偶然发现这篇文章的疲惫的旅行者!

短篇小说:

以下工作 - 毫无疑问 - 但如果枚举值 由具有“计数”的基础数组或列表支持,则可能会出现小的性能损失/预计算:

public bool IsValid

   get  return SomeMethodReturningEnumerable().Count() <= threshold;   <--- small performance issue here


public IEnumerable<SomeObject> SomeMethodReturningEnumerable()
   yield return foo;
   yield return bar; etc

对 .Count() 方法的调用可能会遍历可枚举中的每一项,然后然后将总计数与阈值进行比较。我们变得更聪明可以做得更好:

    public bool IsValid
    
       get  return !SomeMethodReturningEnumerable().HasMoreThan(threshold);   <--- neato!
    

    public static bool HasLessThan<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count - 1);

    public static bool HasLessOrEqualTo<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count);

    public static bool HasMoreOrEqualTo<T>(this IEnumerable<T> sequence, int count) => sequence.HasMoreThan(count - 1);

    public static bool HasMoreThan<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: false);

    public static bool HasExactly<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: true);

    public static bool EnumerationCounterImpl<T>(this IEnumerable<T> sequence, int count, bool equals_vs_greaterThan = true) //0
    
        if (equals_vs_greaterThan && count < 0)
            throw new ArgumentException($"nameof(count) is less than zero!");

        if (!equals_vs_greaterThan && count < 0)
            return true;

        var staticCount = (sequence as ICollection)?.Count                              
                          ?? (sequence as ICollection<T>)?.Count
                          ?? (sequence as IReadOnlyCollection<T>)?.Count;

        if (staticCount != null)
            return staticCount > count;

        using (var enumerator = sequence.GetEnumerator()) //1 optimization
        
            for (int i = 0; i < count + 1; i++)
            
                if (enumerator.MoveNext())
                    continue;

                return false;
            

            return !equals_vs_greaterThan //     ==
                   || enumerator.MoveNext(); //  >
        

        //0 https://blog.slaks.net/2015-01-12/linq-count-considered-occasionally-harmful/
        //1 using the enumerator directly is slightly faster than using LINQ methods   it avoids allocating an extra iterator
        //  state machine compared to using skip()
    

那里!问题再次解决,但这次我们注重性能!

【讨论】:

【参考方案5】:

怎么样:

public bool IsValid

    get  return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); 

【讨论】:

以上是关于IEnumerable 没有 Count 方法的主要内容,如果未能解决你的问题,请参考以下文章

EF下怎么理解IEnumerable/ICollection/IQueryable?

我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]

将控件的可见性绑定到 IEnumerable 的“计数”

当类没有实现 IEnumerable 时,GetEnumerator 方法是不是仍然是幂等的

Enumerable.Count() 与属性 Count [重复]

为IEnumerable扩展一个ForEach方法