列表:Count vs Count() [重复]
Posted
技术标签:
【中文标题】列表:Count vs Count() [重复]【英文标题】:Lists: Count vs Count() [duplicate] 【发布时间】:2011-05-05 03:12:36 【问题描述】:给定一个列表,确定里面的元素个数首选哪种方法?
var myList = new List<string>();
myList.Count
myList.Count()
【问题讨论】:
@Randy:根据变量的类型,最好使用 'var' 而不是 'Dictionary,int>'。这是一个偏好问题。 @Randy:不确定这与问题有关;这是一个风格选择(我也碰巧不同意,但讨论是针对不同的主题!)。 @Randy:为什么不呢?编译器知道类型,我为什么要写它?此外,你知道类型吗?它是什么?int
? long
?有关系吗?当然不是这个代码,或者大多数代码......
@Randy - 正如许多人所说,这是一个偏好问题,对于我不知道类型的情况,它更快:)
***.com/questions/737835/resharper-and-var/8796643
【参考方案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】:
总是更喜欢类型的Count
和Length
属性,而不是扩展方法Count()
。对于包含它们的每种类型,前者都是 O(1)。 Count()
扩展方法有一些类型检查优化,可以使其在 O(1) 时间内运行,但如果底层集合不是它所知道的少数类型之一,则会降级到 O(N)。
【讨论】:
仅供参考:如果您要检查是否存在任何内容,请使用Any()
扩展方法。
@Greg 我更喜欢Count > 0
而不是Any()
。
在 OP 的示例中(使用 ListmyList.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()
将在它是一个数组、一个列表等时工作。 )以上是关于列表:Count vs Count() [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Android ListView.count vs ListView.size
我想删除列表的重复项,是否有可能在有条件的情况下使用count()函数?