在扩展方法中使用新对象更新IEnumerable

时间:2012-07-16 06:52:20

标签: c# extension-methods 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)。 但这似乎不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

IEnumerable[<T>] 无意添加 。您可以连接(生成新序列),但这不会更改原始序列(/ list / array / etc)。您可以使用Enumerable.Concat执行此操作,即return orginalColl.Concat(...)。但强调:这不会更新原始集合

)。例如,它不适用于任何基于迭代器块(或任何其他IList[<T>]不是IEnumerable<T>)的东西 - 例如它不适用于{{1 }}

如果您希望更改来源,那么您应该传递类似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); } }

答案 1 :(得分:1)

不,你不能。 在您的代码中,您将可枚举的源克隆到列表中,然后向其中添加元素并忘记,因为您没有返回任何内容。

尝试

var result = orginalColl.Concat(collectionToAdd);

请查看http://msdn.microsoft.com/en-us/library/bb302894.aspx以获取更多信息和示例。

答案 2 :(得分: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);
    }
}