Tür IEnumerable<T>
, bu tür işlemleri desteklemez. IEnumerable<T>
Arayüzün amacı, tüketicinin bir koleksiyonun içeriğini görmesine izin vermektir. Değerleri değiştirmemek.
.ToList (). Add () gibi işlemler yaptığınızda yeni List<T>
bir liste oluşturursunuz ve bu listeye bir değer eklersiniz . Orijinal listeyle bağlantısı yoktur.
Yapabileceğiniz şey, IEnumerable<T>
katma değerle yeni bir tane oluşturmak için Uzantı ekle yöntemini kullanmaktır .
items = items.Add("msg2");
Bu durumda bile orijinal IEnumerable<T>
nesneyi değiştirmez . Bu, bir referans tutarak doğrulanabilir. Örneğin
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Bu işlem kümesinden sonra değişken temp hala değerler kümesinde sadece tek bir eleman "foo" ile numaralandırılabilir bir değere referans verirken, öğeler "foo" ve "bar" değerleri ile farklı bir numaralandırılabilir referans olacak.
DÜZENLE
İçeriğin, tipik bir uzantı yöntemi olmadığını, IEnumerable<T>
çünkü tanımladığım ilk yöntemlerden biri olduğunu unutuyorum . İşte burada
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
IEnumerable<T>
yalnızca koleksiyonları sorgulamak içindir. LINQ çerçevesinin belkemiğidir. Her zaman gibi diğer bazı koleksiyonunun bir soyutlamadırCollection<T>
,List<T>
ya,Array
. Arabirim yalnızca , genişleyen koleksiyonun her seferinde bir öğe yürümesini sağlayanGetEnumerator
bir örneğini döndüren bir yöntemIEnumerator<T>
sağlar. LINQ genişletme yöntemleri bu arayüzle sınırlıdır.IEnumerable<T>
yalnızca birden çok koleksiyonun parçalarının bir araya gelmesini temsil edebileceği için okunmak üzere tasarlanmıştır.