75 c# linq collections list count
使用集合我有两种获取对象计数的方法; Count(属性)和Count()方法.谁知道关键的区别是什么?我可能错了,但我总是在任何条件语句中使用Count属性,因为我假设Count()方法对集合执行某种查询,其中Count必须在我获得之前已经分配.但这是一个猜测 - 如果我错了,我不知道性能是否会受到影响.
编辑:出于好奇,那么,如果集合为空,Count()会抛出异常吗?因为我很确定Count属性只返回0.
Ian*_*son 96
反编译Count()扩展方法的源会显示它测试对象是否为ICollection(通用或其他),如果是,则返回基础Count属性:
因此,如果您的代码访问Count而不是调用Count(),您可以绕过类型检查 - 理论性能优势,但我怀疑它会是一个明显的!
// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    checked
    {
        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;
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}
Aar*_*nLS 30
表现只是选择其中一个的一个原因.选择.Count()意味着您的代码将更通用.我曾经有过这样的场合,我重构了一些不再生成集合的代码,而是像IEnumerable那样更通用的东西,但其他代码因为它依赖.Count而破坏了我必须将其更改为.Count().如果我指出要.Count()在任何地方使用,代码可能更可重用和可维护.通常选择使用更通用的界面,如果你可以逃脱它是你最好的选择.通过更通用,我的意思是更简单的接口,由更多类型实现,从而为您提供更强的代码兼容性.
我不是说.Count()更好,我只是说有其他考虑因素更多地涉及你正在编写的代码的可重用性.
ang*_*son 18
该.Count()方法可能足够智能,或者知道有问题的类型,如果是,它可能使用底层.Count属性.
然后,它可能不会.
我想可以安全地假设如果集合.Count本身具有属性,那么在性能方面这将是你最好的选择.
如果该.Count()方法不知道该集合,它将枚举它,这将是一个O(n)操作.
Count简短版本:如果您可以在属性和方法之间进行选择,Count()请始终选择属性。  
差异主要在于操作效率。所有公开属性的 BCL 集合都Count以 O(1) 的方式进行。不过,该Count()方法可能而且通常会花费 O(N) 的成本。对于某些实现,有一些检查尝试使其达到 O(1),但这绝不是保证的。  
该Count()方法是适用于任何IEnumerable<>. 您可能期望该Count()方法迭代整个集合来查找计数,但我相信 LINQ 代码实际上有一些优化来检测 Count 属性是否存在,如果存在则使用它。
所以他们应该做几乎相同的事情。Count 属性可能稍微好一些,因为不需要在那里进行类型检查。
Count()方法是一个扩展方法,它迭代IEnumerable <>的每个元素并返回有多少元素.如果IEnumerable的实例实际上是List <>,那么它被优化以返回Count属性而不是迭代所有元素.
| 归档时间: | 
 | 
| 查看次数: | 29559 次 | 
| 最近记录: |