C# 中的 .Any 和 .Count 哪个更有效(扩展方法)
What's more efficient in .Any and .Count in C# (Extension methods)
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 个项目。
请指教。谢谢
正在审查框架...视情况而定。我在假设世界中的最初直觉:
Any()
checks to see if there is a single value. If so, then it
returns true. This is an O(1) operation.
Count()
would have to either do one of the following:
1) access a running tally of items in the collection, or 2) count
the items in the collection
In the best case (#1) the operation is O(1). In the worst, (#2), it's
O(n).
实际上,Any()
使用集合的迭代器来确定是否有下一个值。因此,Any()
是否为 O(1) 操作取决于集合。如果它是一个糟糕的实现,它可能是 O(n)。
例如,假设 Array 迭代器很愚蠢,它会查找第一个非空值。它必须检查数组中的每个项目,因此 Any()
在这种情况下意味着 O(n)。 (事实上 ,对于长度> 1的任何数组,Any()
returns true
)。
Count()
尝试查看集合是否实现了 ICollection
或 ICollection<T>
,如果是,则 returns Count
属性'值。如果底层实现保留一个 运行 选项卡,那可能是 O(1)。如果不是,那可能是 O(n) 最坏的情况。
如果可枚举 没有 实现这些接口之一,Count()
简单地迭代整个集合,沿途计数。那是 O(n).
tl;dr:根据实现,Any()
更有可能比 Count()
快得多。
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 个项目。
请指教。谢谢
正在审查框架...视情况而定。我在假设世界中的最初直觉:
Any()
checks to see if there is a single value. If so, then it returns true. This is an O(1) operation.
Count()
would have to either do one of the following:1) access a running tally of items in the collection, or 2) count the items in the collection
In the best case (#1) the operation is O(1). In the worst, (#2), it's O(n).
实际上,Any()
使用集合的迭代器来确定是否有下一个值。因此,Any()
是否为 O(1) 操作取决于集合。如果它是一个糟糕的实现,它可能是 O(n)。
例如,假设 Array 迭代器很愚蠢,它会查找第一个非空值。它必须检查数组中的每个项目,因此 Any()
在这种情况下意味着 O(n)。 (事实上 ,对于长度> 1的任何数组,Any()
returns true
)。
Count()
尝试查看集合是否实现了 ICollection
或 ICollection<T>
,如果是,则 returns Count
属性'值。如果底层实现保留一个 运行 选项卡,那可能是 O(1)。如果不是,那可能是 O(n) 最坏的情况。
如果可枚举 没有 实现这些接口之一,Count()
简单地迭代整个集合,沿途计数。那是 O(n).
tl;dr:根据实现,Any()
更有可能比 Count()
快得多。