2012-07-16 68 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); 
    } 
}