【问题标题】:Lists: Count vs Count() [duplicate]列表:Count vs Count() [重复]
【发布时间】:2011-05-05 03:12:36
【问题描述】:

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

var myList = new List<string>();

myList.Count
myList.Count()

【问题讨论】:

  • @Randy:根据变量的类型,最好使用 'var' 而不是 'Dictionary,int>'。这是一个偏好问题。
  • @Randy:不确定这与问题有关;这是一个风格选择(我也碰巧不同意,但讨论是针对不同的主题!)。
  • @Randy:为什么不呢?编译器知道类型,我为什么要写它?此外,你知道类型吗?它是什么? int? long?有关系吗?当然不是这个代码,或者大多数代码......
  • @Randy - 正如许多人所说,这是一个偏好问题,对于我不知道类型的情况,它更快:)

标签: c# .net list linq count


【解决方案1】:

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;
}

【讨论】:

  • "So at the end of the day, there's no difference ..." 除了 LINQ 需要一天的时间来决定它使用内置函数 ;)
  • 略有不同。 LINQ 必须检查它是否实现了 ICollection ......所以有一个小的(可能甚至不明显)命中来进行这个检查。
  • @BFree,我们如何在 VB.NET 中调用它?
  • 从维护的角度来看,我建议使用Count(),以防您的类型从List 更改为其他没有Count 属性的IEnumerable。跨度>
  • @juanora 这个答案是 11 年前的,所以当时我无法回答。然而,这些天来,那里有另一个检查非通用 ICollection 的情况,在这种情况下它返回 Count。见这里:github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/… Arrays 实现了 ICollection,因此 Arrays 也会被它拾取。
【解决方案2】:

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

【讨论】:

  • 仅供参考:如果您要检查是否存在任何内容,请使用 Any() 扩展方法。
  • @Greg 我更喜欢Count &gt; 0 而不是Any()
  • 在 OP 的示例中(使用 List),绝对使用 Count>0。如果您使用的是 IEnumerable,则 Any() 在大多数情况下是首选,除非底层源本身可能是 List
【解决方案3】:

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

myList.Count() 正在调用一个扩展方法(由 LINQ 引入)循环遍历 IEnumerable 中的所有项目,因此应该会慢很多。

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

您不太可能分辨出大多数应用程序的速度差异。

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

【讨论】:

  • 这不准确。如果您查看 Count() 方法的实现,它会检查 IEnumerable 是否实现了 ICollection,如果实现,则使用 Count 属性。所以他们在一天结束时都是一样的。
  • 你能详细说明一下吗?内置是什么意思?
【解决方案4】:

如果您想更改收藏的类型,最好使用Count() 扩展名。这样您就不必重构代码(例如使用Length)。

【讨论】:

  • 使用 Count() 如果您决定使用不同类型的集合,那么您不必担心更改 1(因为 .Count() 将在它是一个数组、一个列表等时工作。 )
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 2011-02-12
  • 1970-01-01
  • 2011-03-01
  • 2020-11-21
  • 2012-04-13
相关资源
最近更新 更多