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