IList проти IE незліченна для колекцій організацій


146

Якщо у мене є об'єкти в моєму домені зі списками речей, чи слід їх виставляти як ILIST або IEnumerables? Наприклад, замовлення має купу OrderLines.


Чи було б розумно реалізувати і те, і інше?
PedroC88

4
Це не було б. Іліст успадковує від IEnumerable.
Невідомо1987

Відповіді:


183

IEnumerable<T>представляє серію предметів, які ви можете повторити (наприклад, використовуючи foreach), тоді IList<T>як це колекція, яку ви можете додати або видалити з неї.

Зазвичай ви хочете мати змогу змінювати замовлення, додаючи до нього або видаляючи OrderLines, тому ви, ймовірно, хочете, щоб Order.Lines був an IList<OrderLine>.

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


5
Ви також можете скористатись списком IReadOnlyListабо, IReadOnlyCollectionякщо вам потрібен, матеріалізований, але ви не хочете його додавати чи видаляти.
julealgon

Тоді IReadOnlyListнемає сенсу.
ajeh

24

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


1
Я вважаю, що ви завжди можете інсталювати реалізацію IList за допомогою IEnumerable, якщо вам потрібно отримати доступ до методу підрахунку тощо. Наприклад: IEnumerable <string> enumerable = <some-IEnumerable> Список <string> myList = new List <string> (перелічений ); Однак спосіб викриття колекції повинен залежати від таких міркувань, як ви хочете, щоб властивість колекції була непорушною (IEnumerable не дозволить вам змінювати колекцію) чи ні (читайте IList)
Sudhanshu Mishra

11
IEnumerable <T> .Count () перевіряє, чи є базовим типом ICollection <T>, який реалізує властивість Count.
andleer

"Ви не можете отримати доступ до колекції через індекс" - що з ElementAtметодом?
ivamax9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.