IEnumerableオブジェクトに1つのアイテムを追加する方法は次のとおりです。
_//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };
//Add one item
arr = arr.Concat(new string[] { "JKL" });
_
これは厄介です。ただし、ConcatSingle()
のようなメソッドは表示されません。
単一のアイテムをIEnumerableオブジェクトに追加するよりクリーンな方法はありますか?
いいえ、組み込みの言語/フレームワーク機能を使用するのと同じくらい簡潔です。
必要に応じて、常に拡張メソッドを作成できます。
arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> Append<T>(
this IEnumerable<T> source, params T[] tail)
{
return source.Concat(tail);
}
}
IEnumerable
は不変コレクションです。アイテムを追加または削除できないことを意味します。代わりに、have toこのための新しいコレクションを作成し、単にリストに変換して追加します:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
拡張メソッドを書くConcatSingle
:)
public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
return source.Concat(new [] { item } );
}
ただし、用語にもっと注意する必要があります。IEnumerable<T>
にアイテムを追加することはできません。 Concat
は新しいインスタンスを作成します。
例:
var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count()); // 10
Console.WriteLine(items.Count()); // 11
ご覧のとおり、original
に保存した元の列挙は変更されていません。
IEnumerable
は読み取り専用なので、リストに変換する必要があります。
var new_one = arr.ToList().Add("JKL");
または、拡張メソッドのように取得できます;
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
return source.Concat(item);
}
IEnumerableに配列を割り当てています。 IEnumerableの代わりにArray型を使用しないのはなぜですか?
それ以外の場合は、コレクションを変更する場合にIList(またはリスト)を使用できます。
IEnumerableは、読み取りが必要なメソッドparamsと、その中のアイテムを変更する必要があるIList(またはList)に対してのみ使用します。