public void MethodName(ObservableCollection<DataCollection> dataCollection)
{
if (dataCollection != null)
{
IsChecked = dataCollection.Any(o => o.DataCollectionID.Equals(30));
IsChecked = dataCollection.Where(o => o.DataCollectionID.Equals(30)).Count() > 0;
}
}
任何人都可以解释一下,从上面两个过滤中使用的最有效方法是什么? 。任何?或.Where.Count?
注意:请考虑dataCollection有超过10,000个项目。
请指教。谢谢
答案 0 :(得分:1)
审查框架......这取决于。我在假设领域的初衷:
Any()
检查是否有单个值。如果是这样,那么它 返回true。这是O(1)操作。
Count()
必须执行以下操作之一:1)访问集合中项目的运行记录,或2)计数 集合中的项目
在最好的情况下(#1),操作是O(1)。在最坏的情况下,(#2),它是 为O(n)。
实际上,Any()
使用集合的迭代器来确定是否存在下一个值。因此,无论Any()
是否为O(1)操作,都取决于集合。如果它是一个糟糕的实现,它可能是O(n)。
例如,假设Array迭代器是愚蠢的,并查找第一个非null值。它必须检查数组中的每个项目,因此在这种情况下Any()
表示O(n)。 (事实上,对于任何长度为&gt; 1的数组,Any()
都会返回true
。
Count()
尝试查看集合是否实现ICollection
或ICollection<T>
,如果是,则返回Count
属性的值。如果底层实现保持运行选项卡,则可以是O(1)。如果不是,那可能是O(n)最坏的情况。
如果可枚举的不实现其中一个接口,Count()
只是迭代整个集合,依赖于路径。那是O(n)。
tl; dr :根据具体实施,Any()
更有可能比Count()
快得多。