Der Typ IEnumerable<T>
unterstützt solche Operationen nicht. Der Zweck der IEnumerable<T>
Schnittstelle besteht darin, einem Verbraucher das Anzeigen des Inhalts einer Sammlung zu ermöglichen. Die Werte nicht ändern.
Wenn Sie Vorgänge wie .ToList (). Add () ausführen, erstellen Sie eine neue List<T>
und fügen dieser Liste einen Wert hinzu. Es besteht keine Verbindung zur ursprünglichen Liste.
Was Sie tun können, ist die Erweiterungsmethode Hinzufügen, um eine neue IEnumerable<T>
mit dem Mehrwert zu erstellen .
items = items.Add("msg2");
Auch in diesem Fall wird das ursprüngliche IEnumerable<T>
Objekt nicht geändert . Dies kann überprüft werden, indem ein Verweis darauf gehalten wird. Zum Beispiel
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Nach diesem Satz von Operationen verweist die Variable temp immer noch nur auf eine Aufzählung mit einem einzelnen Element "foo" im Wertesatz, während Elemente auf eine andere Aufzählung mit den Werten "foo" und "bar" verweisen.
BEARBEITEN
Ich vergesse immer wieder, dass Add keine typische Erweiterungsmethode ist, IEnumerable<T>
da es eine der ersten ist, die ich am Ende definiere. Hier ist es
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>
ist nur zum Abfragen von Sammlungen gedacht. Es ist das Rückgrat für das LINQ-Framework. Es ist immer eine Abstraktion von einer anderen Sammlung wieCollection<T>
,List<T>
oderArray
. Die Schnittstelle bietet nur eineGetEnumerator
Methode, die eine Instanz zurückgibtIEnumerator<T>
, mit der die erweiterte Sammlung einzeln durchlaufen werden kann. Die LINQ-Erweiterungsmethoden sind durch diese Schnittstelle begrenzt.IEnumerable<T>
ist schreibgeschützt, da es eine Ansammlung von Teilen mehrerer Sammlungen darstellen kann.