Зачем использовать ICollection <T>вместо IList <T>? - PullRequest
0 голосов
/ 14 октября 2019

Я читал статьи, в которых говорится, что используйте ICollection<T>, если вам нужна функциональность IEnumerable<T>, но также требуется свойство Count.

Однако, поскольку методы расширения в System.Linq.Enumerable предоставляют методынапример, ElementAt(), почему бы вам не использовать вместо него IList<T>, поскольку он использует индексатор?

Мне кажется, что ICollection<T> может делать то же, что может IList<T>, только вгораздо более многословный и менее читабельный способ.

Какой сценарий будет более читабельным / более эффективным, более строгим в соответствии с принципами SOLID, или какой-нибудь, как лучше каким-либо образом использовать ICollection<T> вместо IList<T>?

РЕДАКТИРОВАТЬ:

Ответы на дубликаты вопросов не отвечают на мой вопрос, поскольку они избегают говорить о том факте, что ICollection<T> может делать то, что делает IList<T>, но в гораздо более уродливомway.

Если они оба делают одно и то же, почему бы просто не использовать очиститель IList<T>?

Я получил гораздо лучшие ответы здесь: https://www.reddit.com/r/csharp/comments/dl9xao/why_use_icollectiont_over_ilistt/

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Короткий ответ: вы можете использовать IList для любого списка элементов. Фактически, IList реализует ICollection, а ICollection реализует IEnumerable. Вы можете решить, какой уровень абстракции вам нужен в соответствии с контекстом.

Подробнее см. эту ссылку .

Приветствия,

0 голосов
/ 14 октября 2019

Если вы смотрите на это с точки зрения накладных расходов, я думаю, что вам лучше всего ставить посредника между двумя ISet<T> и его реализацией HashSet<T>.

Наборы часто упускаются из виду, но они чрезвычайно эффективны при определении «владения» и экономят место благодаря тому, что не полагаются на ключи, поскольку они не заботятся о порядке.

Важным отличием является то, что Add(), Remove() и Contains() все становятся o (1) (против обычно o (n) стоимости IList<T>.

также SortedSet<T>, если заказ становится проблемой.

Вот отличная статья , объясняющая, что это намного лучше, чем я могу. Важный фрагмент:

HashSet<T> - это выбор, если вы хотите максимально быстрый поиск, но не заботитесь о порядке. Напротив, SortedSet<T> даст вам отсортированную коллекцию с небольшим снижением производительности.

...