Я пытаюсь заменить использование T[]
или List<T>
в качестве параметров функции и возвращаемых значений более подходящими типами, такими как IEnumerable<T>
, ICollection<T>
и IList<T>
.
ICollection<T>
Насколько я понимаю, предпочтительнее IList<T>
, когда вам нужны только базовые / простые функции сбора (например, функции перечисления и подсчета), поскольку это обеспечивает это с наименьшим ограничением.Из прочтенного здесь одного из главных отличий, который я думал, было то, что ICollection<T>
не требует, чтобы базовая коллекция была основана на индексе, где IList<T>
делает?
При переключении моих List<T>
ссылок мне нужнозаменить вызов List<T>.GetRange()
, и я был очень удивлен, обнаружив метод расширения ICollection<T>.TakeWhile()
, который имеет выбор, поддерживающий перегрузку на основе индекса ?! (ссылка msdn)
Я запутался, почему этот метод существует в ICollection, где нет индекса, основанного на этом интерфейсе?Я неправильно понял или как этот метод может работать, если базовая коллекция, например, Hashset или что-то еще?