确定对ICollection Count的调用是否会导致迭代

时间:2011-05-03 12:54:03

标签: c# count icollection

假设我想从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集合为它添加一百万个文档,并计算它以查看对Count的调用速度有多快。我问这个问题,因为我可能会选择使用IEnumerable而不是Collection,因为我的Collections在数量和数据上都是如此之大,以及一次返回所有这些都是一个问题。不过我想知道IEnumarable的缺点,Joshua指出锁定它不是一个好主意,在另一个问题上。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

这只是围绕属性的最佳实践 - 让它们的价值变得便宜 - 期间。

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

当然,有人当然可以提供昂贵的ICollection.Count实现 - 然而那个人并没有做正确的事情。

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

答案 2 :(得分:1)

Count的实施是否相对昂贵?可能,但它们很少见; .NET Framework类经过优化,具有良好的全面效率。

重要吗?几乎肯定不是。除非您在数百万元素的集合中查询Count数百万次,否则差异很小,无关紧要:

  • 对包含100万个整数的List<T>.Count的1亿次调用​​:0.85s
  • 对包含100万个整数的HashSet<T>.Count()的1亿次调用​​:1.45s