web-dev-qa-db-ja.com

IEnumerable <T>に1つのアイテムを追加する最良の方法は何ですか?

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オブジェクトに追加するよりクリーンな方法はありますか?

25
user2023861

いいえ、組み込みの言語/フレームワーク機能を使用するのと同じくらい簡潔です。

必要に応じて、常に拡張メソッドを作成できます。

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);
    }
}
16
LukeH

IEnumerable不変コレクションです。アイテムを追加または削除できないことを意味します。代わりに、have toこのための新しいコレクションを作成し、単にリストに変換して追加します:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
8
cuongle

拡張メソッドを書く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に保存した元の列挙は変更されていません。

7
Daniel Hilgarth

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);
}
6
Soner Gönül

IEnumerableに配列を割り当てています。 IEnumerableの代わりにArray型を使用しないのはなぜですか?

それ以外の場合は、コレクションを変更する場合にIList(またはリスト)を使用できます。

IEnumerableは、読み取りが必要なメソッドparamsと、その中のアイテムを変更する必要があるIList(またはList)に対してのみ使用します。

2
Caelan