为啥我应该使用 Any 方法而不是 Count? [复制]
Posted
技术标签:
【中文标题】为啥我应该使用 Any 方法而不是 Count? [复制]【英文标题】:Why should I use Any method instead of Count? [duplicate]为什么我应该使用 Any 方法而不是 Count? [复制] 【发布时间】:2012-09-18 02:59:48 【问题描述】:可能重复:Which method performs better: .Any() vs .Count() > 0?
我只是想知道为什么我应该使用Any()
而不是Count()
?,如果我们以msdn 为例:
class Pet
public string Name get; set;
public int Age get; set;
class Person
public string LastName get; set;
public Pet[] Pets get; set;
public static void AnyEx2()
List<Person> people = new List<Person>
new Person LastName = "Haas",
Pets = new Pet[] new Pet Name="Barley", Age=10 ,
new Pet Name="Boots", Age=14 ,
new Pet Name="Whiskers", Age=6 ,
new Person LastName = "Fakhouri",
Pets = new Pet[] new Pet Name = "Snowball", Age = 1,
new Person LastName = "Antebi",
Pets = new Pet[] ,
new Person LastName = "Philips",
Pets = new Pet[] new Pet Name = "Sweetie", Age = 2,
new Pet Name = "Rover", Age = 13
;
// Determine which people have a non-empty Pet array.
IEnumerable<string> names = from person in people
where person.Pets.AsQueryable().Any()
select person.LastName;
foreach (string name in names)
Console.WriteLine(name);
/* This code produces the following output:
Haas
Fakhouri
Philips
*/
如果我用了会怎样:
IEnumerable<string> names = from person in people
where person.Pets.Count() > 0
select person.LastName;
它会给出相同的结果! , (我不认为它是为了简短或什么而创建的),Any()
有什么功能吗??
【问题讨论】:
查看这篇文章:Which method performs better any vs count 有人递给你一个米袋,问“有米粒吗?”。你是:看看是否有“任何”大米(至少一粒谷物),还是 b:坐下来数一数,只在完成后报告是/否? 因为它是命中一个数组,所以“count>0”要快得多(在这种情况下是 11X)。我刚刚对上面的代码进行了基准测试(将 Console.Writeline 移出),“count >0”花费了 1400 个滴答声,而 any() 花费了 15100 个滴答声! [x64,发布模式,未附加调试器]。这是因为 Any() 必须创建和销毁对象。但是,对于数据库连接,通常情况相反。 Any() 通常表现更好。 【参考方案1】:Any
只检查序列是否包含至少一个元素,而Count
需要遍历所有元素。这就是区别。 Any
优于 Count
的经典场景是这样的:
if (sec.Count() > 0)
对
if (sec.Any())
【讨论】:
想象一下如果你尝试Count
一个无限序列会发生什么......
@Claudio ,它只是使用 Any 吗?重载了怎么办?
对于重载也是如此,Any 一旦找到满足谓词的第一个元素就停止,而 Count 必须扫描整个序列(可能是无限的,如前所述)。【参考方案2】:
根据IEnumerable<>
的具体实现 隐藏在接口后面,Any
可能比Count
快得多。例如,如果实际上有 LINQ-to-SQL 或其他一些数据库提供程序,则可能是检查表中 至少 1 条记录或必须计数 每个 记录之间的区别strong> 记录在数据库中。
但是,在我看来,更重要的原因是使用Any()
比检查Count() > 0
更能表达您的意图。它询问“有任何物品吗?”而不是“找出有多少项目。这个数字是否大于零”。对你来说,“有什么物品吗?”的哪个翻译更自然? ?
【讨论】:
我喜欢这个答案,一般来说,您必须记住,Linq 可能必须与查询提供程序一起工作,这可能会将表达式翻译成其他东西(如 SQL),因此表达 INTENT 很重要,Any()
的意图可能对应于与您在执行 Count()
时所需的完全不同的物理操作。【参考方案3】:
实际上,这取决于。
如果您的集合是 IEnumerable 的形式,则 Count() 方法将遍历所有元素,而 Any() 则不必这样做。因此,对于可枚举, Any() 将具有(潜在的显着)性能优势。
然而,在您的示例中,Pets 是一个数组,因此您最好使用 .Length 而不是 .Count()。在这种情况下,性能不会有显着差异。
【讨论】:
【参考方案4】:要获得计数,代码必须遍历整个序列。在一个长的、延迟执行的序列上,这可能会花费大量时间。由于我只想知道序列是否包含一个或多个元素,因此使用 Any() 扩展方法计算效率更高。
阅读:Eric Lippert's Blog
也可供阅读:Count() and Count property
【讨论】:
以上是关于为啥我应该使用 Any 方法而不是 Count? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]