2012-07-16 71 views
3

我想新的IEnumerable對象添加到原之一。我可以使用擴展方法更新原始對象嗎?IEnumerable的更新與擴展方法,新的對象

public static void AddItems<TSource>(this IEnumerable<TSource> orginalColl,  
IEnumerable<TSource> collectionToAdd) 
{ 
foreach (var item in collectionToAdd) 
{ 
    orginalColl.ToList<TSource>().Add(item);    
}    
} 

我打電話是這樣的:OrgCollecation.AddItems(newCollection)。 但這似乎並不奏效。任何想法?

回答

2

IEnumerable[<T>]不打算添加。你可以連接(產生一個新的序列),但不會改變原始序列(/ list/array/etc)。你可以用Enumerable.Concat這樣做,即return orginalColl.Concat(...)。但強調:這不會更新原始集合

什麼你可以也將轉換爲IList[<T>]或相似,但這將是濫用(將僅適用於某些情況下工作,而不是全部)。例如,對於任何基於迭代器塊(或其他IEnumerable<T>而不是IList<T>)的任何內容(例如,它不會在someSource.Where(predicte)上工作),它都不起作用。

如果您希望更改來源,那麼您應該傳遞類似IList[<T>]。例如:

public static void AddItems<TSource>(this IList<TSource> orginalColl, 
    IEnumerable<TSource> collectionToAdd) 
{ 
    foreach (var item in collectionToAdd) 
    { 
     orginalColl.Add(item);    
    }    
} 

(順便說一句,AddRange將是一個替代名稱的上方,以匹配List<T>.AddRange

1

你就是不行。 在您的代碼中,您將源枚舉克隆到列表中,然後向其添加元素並忘記,因爲您沒有返回任何內容。

嘗試

var result = orginalColl.Concat(collectionToAdd); 

看看http://msdn.microsoft.com/en-us/library/bb302894.aspx的更多信息和示例。

0

簡而言之,IEnumerable<T>應該認爲是不變的,你不能添加到它。你不知道什麼樣的集合正在實現它,例如它可能是你正在枚舉的文件系統中的串行端口輸入或只讀文件。

你要對集合進行的操作與ICollection<T>的用例匹配得更好;它由框架中的通用(可變)集合實現。

public static void AddItems<TSource>(this ICollection<TSource> orginalColl, 
     IEnumerable<TSource> collectionToAdd) 
{ 
    foreach (var item in collectionToAdd) 
    { 
     orginalColl.Add(item); 
    } 
}