.NET 4.0'da salt okunur liste veya değiştirilemez liste


100

Anladığım kadarıyla, .NET 4.0 hala salt okunur listelerden yoksun. Çerçeve neden hala bu işlevsellikten yoksun? Bu, alan odaklı tasarım için en yaygın işlevsellik parçalarından biri değil mi?

Java'nın C # üzerinde sahip olduğu birkaç avantajdan biri, bu, Collections.unmodifiablelist (liste) yöntemi biçimindedir; bu , IList <T> veya List <T> 'de gecikmiş gibi görünmektedir.

Kullanmak IEnumerable<T>, sorunun en kolay çözümüdür - ToListkullanılabilir ve bir kopyasını döndürür.


Görünüşe göre sadece gerçek bir salt okunur olmanın tek gerçek yolu List<T>kendi yazınızı yazmaktır , LINQ sorguları List<T>gibi kutudan çıkmış tüm "salt okunur" özelliklerini destekleyen, bildiğim yerleşik bir sınıf yoktur Contains.
JRH

Yanıtlar:


146

Aradığınız ReadOnlyCollection, .NET2'den beri var olan.

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

veya

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

Bu , sarmalanmış koleksiyonda yapılan değişiklikleri yansıtan salt okunur bir görünüm oluşturur .


1
Şimdi bu soruyu sorduğum için kendimi biraz aptal gibi hissediyorum - ve ReadOnlyCollection'ı bilmiyorum
Chris S

54
olma - ben de aynı şeyi aramaya gittiğimde ve Sorunu bulduğumda
Roland Tepp

9
Bulması can sıkıcı derecede zor bir sınıf. Bulmayı beklediğim System.Collections.Generic yerine System.Collections.ObjectModel ad alanında. Sanırım, Generic ad alanı var olmadan önceki yer burasıdır. Yine de temel sınıfın ObjectModel'de kalmasını ve genel sınıfın Generic'e eklenmesini bekliyorum. Sanırım sebepleri vardı, ama bunu can sıkıcı buluyorum.
BlueMonkMN

5
@BlueMonkMN: Neden Collections.Generic ad alanından ayrı olduğunu öğrenmek için bu makaleye bakın .
Uchitha

7
Ama bu bir Liste değil, bu bir Koleksiyon. Bu yüzden eğer onu kullanırsanız, tüm kodunuzu Liste yerine Koleksiyon kullanacak şekilde değiştirmeniz gerekir.
Roman Zabicki



11

Listenin en yaygın modeli tüm öğeleri yinelemekse IEnumerable<T>veya IQueryable<T>etkin bir şekilde salt okunur bir liste olarak işlev görebilir.


4
Listenizi bir IEnumerable olarak ifşa ederseniz, tüketici bunu List'e geri döndürebilir ve değiştirebilir.
JulianR

4
Elbette, ancak kurşun geçirmez bir önlem olması amaçlanmadı - muhtemelen özel alanları okuyabilir ve orijinal listeyi takip edebilirsiniz. Daha çok, bunun salt okunur olarak kalması amacını açıklamak gibi.
Ana Betts

5
Orijinal listeyi de arayarak değiştirmiyorsunuz ToList(), sadece bir kopya
Chris S

Bunun IEnumerable"salt okunur" yöntemlerden oluşan eksiksiz bir set olmadığını unutmayın, örneğin Contains.
jrh

8

2.0'da AsReadOnlylistenin salt okunur sürümünü almak için arayabilirsin . Veya IListbir ReadOnlyCollection<T>nesnede var olanı sarın .


bu, Collections.unmodifiablelist (liste) ile eşdeğerdir
Chris S

Bunu .NET 4'te kaçırdım çünkü gerçek List <T> yerine IList <T> kullanıyordum. Bir List <T> ile uğraştığınız sürece AsReadOnly'nin .NET 4'te hala mevcut olduğundan emin olun.
BlueMonkMN

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.