Ric*_*ard 9 .net c# linq generics collections
我知道这.Count()是LINQ中的扩展方法,从根本上它使用了.Count,所以我想知道,我Count()应该何时使用,何时应该使用.Count?是.Count()主要较好的保存,可查询的集合是尚未执行,因此不具有枚举了吗?我是否更安全,只是总是使用.Count()扩展方法,反之亦然?或者这是否完全取决于收藏?
任何建议或文章都非常感谢.
.Count()在LINQ中反编译扩展方法之后,如果是或者,它似乎正在使用该.Count 属性,这是大多数答案所建议的.现在我能看到的唯一真正的开销是额外的空值和类型检查,我认为这并不是很大,但如果性能至关重要,仍然可以产生少量差异.IEnumerable<T>ICollection<T>ICollection
这是.Count().NET 4.0中反编译的LINQ 扩展方法.
public static int Count<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null)
{
return collection.Count;
}
ICollection collection2 = source as ICollection;
if (collection2 != null)
{
return collection2.Count;
}
int num = 0;
checked
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*age 10
扩展方法适用于任何扩展方法,IEnumerable<T>但它很昂贵,因为它通过迭代来计算序列.如果序列ICollection<T>意味着已知集合的长度,则存在优化.然后使用该Count属性,但这是一个实现细节.
最好的建议是Count出于性能原因使用该属性.
对于尚未执行的可查询集合,.Count()是否更好地保存,因此还没有枚举?
如果你的集合是IQueryable<T>,IEnumerable<T>那么查询提供者可能能够以一些有效的方式返回计数.在这种情况下,您不会受到性能损失,但这取决于查询提供程序.
一个IQueryable<T>不会有一个Count属性,因此存在使用扩展方法和属性之间别无选择.但是,如果查询提供程序未提供有效的计算方法,则Count()可以考虑使用.ToList()将集合提取到客户端.这实际上取决于你打算如何使用它.
| 归档时间: |
|
| 查看次数: |
2269 次 |
| 最近记录: |