タイプIEnumerable<T>
はそのような操作をサポートしていません。IEnumerable<T>
インターフェースの目的は、コンシューマーがコレクションのコンテンツを表示できるようにすることです。値を変更しません。
.ToList()。Add()などの操作を実行すると、新しいList<T>
リストが作成され、そのリストに値が追加されます。元のリストとは関係ありません。
あなたができることは、拡張機能の追加メソッドを使用しIEnumerable<T>
て、追加された値で新しいものを作成することです。
items = items.Add("msg2");
この場合でも、元のIEnumerable<T>
オブジェクトは変更されません。これは、参照を保持することで確認できます。例えば
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
この一連の操作の後も、変数tempは値のセット内の単一の要素「foo」を持つ列挙型のみを参照しますが、項目は値「foo」と「bar」を持つ別の列挙型を参照します。
編集
AddはIEnumerable<T>
、私が定義する最初のメソッドの1つであるため、通常の拡張メソッドではないことを常に忘れています。ここにあります
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>
コレクションのクエリのみを目的としています。これは、LINQフレームワークのバックボーンです。それはいつものようないくつかの他のコレクションの抽象化であるCollection<T>
、List<T>
または、Array
。インターフェイスは、拡張するコレクションを一度に1項目ずつウォークできるようにGetEnumerator
するのインスタンスを返すメソッドのみを提供しますIEnumerator<T>
。LINQ拡張メソッドは、このインターフェイスによって制限されます。IEnumerable<T>
複数のコレクションの一部の集約を表す場合があるため、読み取り専用に設計されています。