我有以下方法:
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
public IEnumerable<RuleViolation> GetRuleViolations(){
//code here
}
为什么当我在.Count()
之上时,它会用红色加下划线?
我收到以下错误:
错误1'System.Collections.Generic.IEnumerable' 不包含的定义 '计数',没有扩展方法 '伯爵'接受第一个论点 类型 'System.Collections.Generic.IEnumerable' 可以找到(你错过了吗? 使用指令或程序集 参考?)c:\ users \ a \ documents \ visual 工作室 2010 \ Projects \ NerdDinner \ NerdDinner \ Models \ Dinner.cs 15 47 NerdDinner
答案 0 :(得分:148)
你添加:
using System.Linq;
位于源代码的顶部,并确保您已获得对System.Core程序集的引用。
Count()
是LINQ to Objects的System.Linq.Enumerable
静态类和LINQ to SQL以及其他进程外提供程序的System.Linq.Queryable
提供的扩展方法。
编辑:事实上,在这里使用Count()
效率相对较低(至少在LINQ to Objects中)。您只想知道是否有任何元素,对吧?在这种情况下,Any()
更适合:
public bool IsValid
{
get { return !GetRuleViolations().Any(); }
}
答案 1 :(得分:3)
key, value
或Any()
方法仅适用于泛型类型。
Count()
如果你有一个没有类型的简单IEnumerable<T>
,请尝试使用
IEnumerable
代替。
答案 2 :(得分:2)
IEnumeration
没有名为Count()
的方法。它只是一种“元素序列”。如果明确需要元素数,请使用例如List
。
如果您使用Linq请记住,扩展方法Count()
实际上可能会在每次调用时重新计算元素数量。
答案 3 :(得分:0)
怎么样:
public bool IsValid
{
get { return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); }
}
答案 4 :(得分:0)
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()
}
那里!问题再次得到解决,但是这次我们对性能很敏感!