IList vs IEnumerable для коллекций объектов

146

Если в моем домене есть объекты со списками вещей, должны ли они быть представлены как ILists или IEnumerables? Например, в Order есть несколько строк OrderLines.

pondermatic
источник
Было бы разумно реализовать оба?
PedroC88
4
Это не будет. IList наследуется от IEnumerable.
Unknown1987

Ответы:

183

IEnumerable<T>представляет серию элементов, которые вы можете перебирать (например, с помощью foreach), тогда IList<T>как это коллекция, которую вы можете добавлять или удалять.

Как правило, вы хотите иметь возможность изменять Order, добавляя или удаляя к нему OrderLines, так что вы, вероятно, хотите, чтобы Order.Lines были IList<OrderLine>.

Сказав это, есть некоторые решения по проектированию рамок, которые вы должны принять. Например, можно ли добавить один и тот же экземпляр OrderLine в два разных заказа? Возможно нет. Таким образом, учитывая, что вы захотите проверить, следует ли добавлять OrderLine в заказ, вы действительно можете IEnumerable<OrderLine>отобразить свойство Lines только как и предоставить методы Add (OrderLine) и Remove (OrderLine), которые могут обрабатывать эта проверка.

Мэтт Гамильтон
источник
5
Вы также можете использовать IReadOnlyListили, IReadOnlyCollectionесли вам нужен материализованный список, но вы не хотите добавлять или удалять его.
Jullealgon
Тогда IReadOnlyListнет смысла.
ajeh
24

Большую часть времени я заканчиваю тем, что использую IList вместо IEnumerable, потому что IEnumerable не имеет метода Count, и вы не можете получить доступ к коллекции через индекс (хотя, если вы используете LINQ, вы можете обойти это с помощью методов расширения).

JoshSchlesinger
источник
1
Я считаю, что вы всегда можете создать экземпляр реализации IList с помощью IEnumerable, если вам нужен доступ к методу count и т.п., например: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); Однако то, как вы представите свою коллекцию, должно зависеть от таких
факторов
11
IEnumerable <T> .Count () проверяет, является ли базовый тип ICollection <T>, который реализует свойство Count.
andleer
«Вы не можете получить доступ к коллекции через индекс» - как насчет ElementAtметода?
ivamax9