Varlıklarda Koleksiyonlar için IList ve IEnumerable


146

Etki alanımda öğe listeleri olan varlıklar olduğunda, bunlar IList veya IEnumerables olarak gösterilmeli mi? Örneğin, Order'ın bir sürü Sipariş Hattı vardır.


Her ikisini de uygulamak akıllıca olur mu?
PedroC88

4
Olmaz. Bir IList, IEnumerable'dan miras alır.
Unknown1987

Yanıtlar:


183

IEnumerable<T>(örneğin foreach kullanarak) üzerinde yineleyebileceğiniz bir dizi öğeyi temsil ederken IList<T>, ekleyebileceğiniz veya çıkarabileceğiniz bir koleksiyondur.

Tipik olarak, Sipariş Hatlarını ekleyerek veya kaldırarak bir Siparişi değiştirebilmek isteyeceksiniz, bu nedenle muhtemelen Sipariş Hatlarının bir IList<OrderLine>.

Bunu söyledikten sonra, almanız gereken bazı çerçeve tasarım kararları var. Örneğin, aynı OrderLine örneğini iki farklı siparişe eklemek mümkün olmalı mı? Muhtemelen değil. Bu nedenle, siparişe bir OrderLine eklenip eklenmeyeceğini doğrulayabilmek isteyeceğiniz için, Lines özelliğini yalnızca bir olarak ortaya çıkarmak IEnumerable<OrderLine>ve işleyebilen Add (OrderLine) ve Remove (OrderLine) yöntemleri sağlamak isteyebilirsiniz. bu doğrulama.


5
Listenin gerçekleştirilmesine ihtiyacınız varsa, ancak eklemek veya çıkarmak istemiyorsanız a IReadOnlyListveya kullanabilirsiniz IReadOnlyCollection.
julealgon

O zaman IReadOnlyListhiç mantıklı değil.
ajeh

24

IEnumerable, Count yöntemine sahip olmadığından ve koleksiyona bir dizin aracılığıyla erişemediğiniz için çoğu zaman IEnumerable üzerinden IList ile devam ediyorum (LINQ kullanıyorsanız, uzantı yöntemleriyle bunun üstesinden gelebilirsiniz).


1
Count yöntemine ve benzerine erişmeniz gerekirse, IEnumerable ile her zaman bir IList uygulamasını başlatabileceğinize inanıyorum: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (numaralandırılabilir ); Ancak, koleksiyonunuzu nasıl ifşa edeceğiniz, koleksiyon özelliğinin değişmez olmasını isteyip istemediğiniz (IEnumerable koleksiyonu değiştirmenize izin vermez) veya istemediğiniz (
IList'i

11
IEnumerable <T> .Count (), temel alınan türün bir Count özelliği uygulayan bir ICollection <T> olup olmadığını kontrol eder.
andleer

"koleksiyona bir dizin yoluyla erişemezsiniz" - peki ya ElementAtyöntem?
ivamax9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.