2013-03-06 56 views
21

這裏是我怎麼會一個項目添加到IEnumerable對象:什麼是最好的方式添加一個項目到IEnumerable <T>?

//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中刪除。 – 2013-03-06 15:27:00

+0

沒有意識到該功能已添加。感謝您的糾正。 – 2013-03-06 16:00:19

回答

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 – 2015-03-10 21:11:08

+5

你不會錯過任何東西。這段代碼是錯誤的。 – KingOfHypocrites 2015-04-13 18:45:47

+0

'Add'不會返回新的列表,而是因爲'List'是一個* mutable *集合,您可以簡單地引用'List'對象來訪問'新列表'。從這個意義上說,這個答案有些迂腐(因爲OP最常見的是詢問如何從另一個「IEnumerable」和一個附加對象創建一個新的IEnumerable)。 – 2015-08-26 20:57:45

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 2013-03-06 20:50:34

2

你分配一個數組轉換爲IEnumerable。爲什麼不使用數組類型而不是IEnumerable?

否則,如果要更改集合,則可以使用IList(或List)。

我使用IEnumerable僅適用於需要讀取IList(或List)時需要更改項目的方法params。

相關問題