Определение, приведет ли вызов к счету ICollection к итерации

Предположим, я хочу получить доступ к объекту из коллекции и хочу убедиться, что он не выполняет итерацию по всей коллекции только для определения размера.

Как я могу определить и проконтролировать, приведет ли вызов "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, так как мои Коллекции настолько велики по количеству и данным по каждому элементу, что будет проблемой вернуть их все сразу. Однако я хотел бы знать и недостатки IEnumarable, Джошуа указал на блокировку, что это не очень хорошая идея, в другом вопросе.

3 ответа

Решение

Поскольку ICollection представляет Count в качестве свойства, можно с уверенностью предположить, что его значение очень дешево получить (т. Е. Оно не должно проходить через всю коллекцию).

Это просто лучшая практика в отношении свойств - получение их значений должно быть дешевым - срок.

Если операция дорогая, то это должен быть метод - например, Count().

Конечно, кто-то может предоставить дорогостоящую реализацию ICollection.Count - однако тогда этот человек не делает все правильно.

Если подсчет количества элементов стоит дорого, они должны реализовывать только IEnumerable, а не ICollection.

Есть ли реализации Count что относительно дорого? Возможно, но они будут редкими; классы.NET Framework настроены на довольно хорошую всестороннюю эффективность.

Это имеет значение? Почти наверняка нет. Если вы не запрашиваете Count миллионы раз по сравнению с коллекциями с миллионами элементов, разница настолько мала, что не имеет значения:

  • 100 миллионов звонков List<T>.Count содержит 1 миллион целых чисел: 0,85 с
  • 100 миллионов звонков HashSet<T>.Count() содержащий 1 миллион целых чисел: 1,45 с

Технически, поскольку ICollection является интерфейсом, у вас нет гарантии, что он не будет проходить по коллекции. Интерфейс может быть реализован в любом случае.

Другие вопросы по тегам