2013-03-06 11 views
21

は、ここで私はIEnumerableを対象に1つの項目を追加する方法は次のとおりです。IEnumerable <T>に1つのアイテムを追加する最も良い方法は何ですか?

//Some IEnumerable<T> object 
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" }; 

//Add one item 
arr = arr.Concat(new string[] { "JKL" }); 

これは厄介です。しかし、私はConcatSingle()のようなメソッドを見ません。

IEnumerableオブジェクトに単一のアイテムを追加するためのクリーンな方法はありますか?

+0

@Chris:私はそれをロールバックしました。機能がSOから削除された理由があります。 –

+0

機能が追加されたことを認識しませんでした。修正をありがとう。 –

答えて

14

これは、組み込みの言語/フレームワーク機能を使用するほど簡単です。

希望する場合は、常に拡張メソッドを作成することができます。

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); 
    } 
} 
8

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

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

おそらく私は何かを見逃しています....しかし、追加は新しいリストを返しません.... https://msdn.microsoft.com/en-us/library/vstudio/3wcytfd1(v = vs.100).aspx –

+5

あなたは何も欠けていません。このコードは間違っています。 – KingOfHypocrites

+0

'Add'は新しいリストを返しませんが、' List'は* mutable *コレクションなので 'List'オブジェクトを参照して 'new list'にアクセスするだけです。この答えは、その意味ではやや意味があります(OPが新しいIEnumerableを別のIEnumerableと1つの追加オブジェクトから作成する方法を尋ねていたことが主な理由です)。 –

6

は、拡張メソッド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に保存されて変化しませんでした。

4

IEnumerableは読み取り専用なので、リストに変換する必要があります。

var new_one = arr.ToList().Add("JKL"); 

それともあなたが得ることができるextension method等。

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item) 
{ 
    return source.Concat(item); 
} 
+0

'IEnumerable 'は読み取り専用です。それは不変ではありません。不変なコレクションとは決して変更されないコレクションです。 'IEnumerable 'は、参照が変更可能な型に型キャストできないことを約束しません。基本型のコレクションは変更されません。 – supercat

2

をあなたがIEnumerableをに配列を代入しています。なぜIEnumerableの代わりにArray型を使用しないのですか?

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

IEnumerableは、項目を変更する必要があるときに、読み込みとIList(またはList)が必要なときにメソッドのparamsに対してのみ使用します。

関連する問題