列表:计数与计数()

Sax*_*man 97 .net c# linq list count

给定一个列表,首选哪个方法来确定里面的元素数量?

var myList = new List<string>();

myList.Count
myList.Count()
Run Code Online (Sandbox Code Playgroud)

BFr*_*ree 120

Count()是LINQ引入的扩展方法,而Count属性是List本身的一部分(派生自ICollection).但在内部,LINQ会检查您的IEnumerable工具ICollection是否使用该Count属性.所以在一天结束时,你使用哪一个没有区别List.

为了进一步证明我的观点,这里是Reflector的代码 Enumerable.Count()

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}
Run Code Online (Sandbox Code Playgroud)

  • "所以在一天结束时,没有区别......"除了LINQ需要一天来决定它使用内置函数的事实;) (28认同)
  • 有一点不同.LINQ必须检查它是否实现ICollection ...所以有一个小的(可能甚至不明显)命中来进行此检查. (11认同)
  • 从维护的角度来看,我建议使用`Count()`以防你的类型从`List`变为其他没有`Count`属性的`IEnumerable`. (7认同)
  • @juanora 这个答案是 11 年前的,所以我无法回答当时的问题。然而,现在,对非泛型 ICollection 进行了另一项检查,在这种情况下它会返回 Count。请参阅此处:https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Count.cs#L29 数组实现 ICollection,因此数组也将被拾取。 (2认同)

Jar*_*Par 24

对扩展方法的类型总是更喜欢CountLength属性Count().前者是包含它们的每种类型的O(1).该Count()扩展方法有一些类型检查的优化,可以使其在O(1)时间也运行,但会降低到O(N),如果底层集合是不是知道的少数类型之一.

  • 仅供参考:如果您正在检查是否存在任何内容,请使用`Any()`扩展方法. (12认同)
  • @Greg我比`Any()`更喜欢`Count&gt; 0`。 (2认同)
  • 在OP的示例中(使用List&lt;T&gt;),一定要使用Count&gt;0。如果您使用 IEnumerable&lt;T&gt;,则在大多数情况下首选 Any(),除非底层源本身可能是 List&lt;T&gt;。 (2认同)

Ian*_*ose 10

myList.Count是列表对象上的一个方法,它只返回一个字段的值,所以非常快.由于它是一个很小的方法,它很可能被编译器(或运行时)内联,然后它们可以允许编译器完成其他优化.

myList.Count()正在调用一个扩展方法(由LINQ引入),它循环遍历IEnumerabl中的所有项目,所以应该慢得多.

但是(在Microsoft实现中)Count扩展方法对Lists有一个"特殊情况",允许它使用列表的Count属性,这意味着Count()方法只比Count属性慢一点.

在大多数应用程序中,您很可能无法区分速度差异.

因此,如果您知道您正在处理List使用Count属性,否则如果您有一个"未知"IEnumerabl,请使用Count()方法并让它为您进行优化.

  • 那不准确.如果查看Count()方法的实现,它会检查IEnumerable是否实现ICollection,如果是,则使用Count属性.所以他们在一天结束时都是一样的. (2认同)

Sim*_*her 7

如果您有任何机会想要更改您的收藏类型,您最好使用Count()扩展程序.这样您就不必重构代码(Length例如使用).