我有2个 IEnumerable
IEnumerablex; IEnumerable y;
确定x中是否存在任何int的最佳方法是什么?
目前我正在使用:
return x.Intersect(y).Count() > 0;
是否可以明显更快地循环并单独测试每个?
foreach (int i in x) { foreach (int j in y) { if (i == j) return true; } } return false;
列表相对较轻,如果在考虑中重要,则x中不超过50个,y中不超过4个.
这将是最快的使用Any
方法,而不是Count
方法:
return x.Intersect(y).Any();
这假设IEnumerable
实现也没有实现ICollection
.在这种情况下,Count
(在的情况下IEnumerable
工具ICollection
)是O(N)操作,同时Any
是总是为O(1)的操作.(因为它只检查单个元素).但是,行为Count
是一个实现细节,你不应该依赖它.
我在博客文章中更深入地写了这篇文章,详细介绍了何时使用Count()
vs Any()
..综上所述:
请使用Enumerable.Any
扩展方法检查序列中是否存在元素.
请勿Enumerable.Count
在与零进行比较时使用扩展方法,因为以下内容在语义上是等效的:
sequence.Count() == 0
!sequence.Any()
请勿Enumerable.Count
在与"非零"条件进行比较时使用扩展方法,因为以下内容在语义上是等效的:
sequence.Count != 0
sequence.Any()