1

假设我想从 a 访问一个对象Collection,并且我想确保它不会Collection为了确定大小而遍历整个对象。

如何确定和控制调用是否Count导致实际迭代集合?(除了使用我自己的实现ICollection),换句话说,有没有提供这个的实现?

public void PrintThreeNames(ICollection<string> names)
{
    //first I want to know if the collection has at least three elements.
    if (names != null && names.Count >= 3)
    {
        IEnumerator<string> enumerator = names.GetEnumerator();
        string value0 = enumerator.Current;
        enumerator.MoveNext();
        string value1 = enumerator.Current;
        enumerator.MoveNext();
        string value2 = enumerator.Current;
        //print values.
        Console.Writeline(value0 + value1 + value2);
    }
}

回答程序员英雄的问题。我想我可以让一个IEnumerable<T>集合向其中添加一百万个文档,并计算它以查看调用的速度有多快Count

我问了这个问题,因为我可能会选择使用IEnumerableover Collection,因为我的集合的数量和每个项目的数据都非常大,一次返回所有这些将是一个问题。

但是,我也想知道它的缺点IEnumarable,Joshua 在另一个问题中指出锁定它不是一个好主意。

4

3 回答 3

2

是否有Count相对昂贵的实现?可能,但它们会很少见;.NET Framework 类针对相当好的全面效率进行了调整。

有关系吗?几乎可以肯定不是。除非您在Count包含数百万个元素的集合中查询数百万次,否则差异是如此之小以至于无关紧要:

  • 包含 100 万个整数的 1 亿次调用List<T>.Count:0.85s
  • 包含 100 万个整数的 1 亿次调用HashSet<T>.Count():1.45s
于 2011-05-03T14:12:41.733 回答
1

因为 ICollection 将 Count 作为属性公开,所以可以安全地假设获取它的值非常便宜(即它不应该遍历整个集合)。

这只是围绕属性的最佳实践——获得它们的价值应该是便宜的——时期。

如果操作很昂贵,那么它应该是一个方法 - 例如 Count()。

当然,有人当然可以提供昂贵的 ICollection.Count 实现 - 但是那个人做事不正确。

如果计算元素的数量很昂贵,他们应该只实现 IEnumerable - 而不是 ICollection。

于 2011-05-03T13:44:29.963 回答
0

从技术上讲,因为 ICollection 是一个接口,所以您不能保证它不会遍历集合。无论如何都可以实现该接口。

于 2011-05-03T12:57:15.777 回答