32

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オブジェクトに単一のアイテムを追加するためのよりクリーンな方法はありますか?

4

6 に答える 6

22

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

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

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);
    }
}
于 2013-03-06T15:23:56.553 に答える
9

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

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
于 2013-03-06T15:22:42.757 に答える
7

拡張メソッドを書く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は変更されていません。

于 2013-03-06T15:22:58.160 に答える
7

は読み取り専用なので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);
}
于 2013-03-06T15:23:53.210 に答える
3

Append()-まさに必要なものであり、.NET標準に追加されたため(2017年)、独自の拡張メソッドを作成する必要がなくなりました。あなたは単にこれを行うことができます:

arr = arr.Append("JKL");

.NETはオープンソースであるため、ここで実装を確認できます(上記で提案したカスタムメソッドよりも洗練されています): https ://github.com/dotnet/runtime/blob/master/src/libraries/System.Linq/ src / System / Linq / AppendPrepend.cs

于 2020-06-12T22:52:45.223 に答える
2

配列をIEnumerableに割り当てています。IEnumerableの代わりに配列型を使用してみませんか?

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

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

于 2013-03-06T15:48:46.350 に答える