4

我想将新的 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)。但这似乎不起作用。任何想法?

4

3 回答 3

2

AnIEnumerable[<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

于 2012-07-16T07:11:10.313 回答
2

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

尝试

var result = orginalColl.Concat(collectionToAdd);

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

于 2012-07-16T07:09:22.250 回答
0

简而言之, anIEnumerable<T>应该被认为是不可变的,你不能添加它。您不知道实现它的是哪种集合,例如,它可能是串行端口输入或您正在枚举的文件系统中的只读文件。

您尝试对集合执行的操作与ICollection<T>更好的用例相匹配;它由框架中的通用(可变)集合实现。

public static void AddItems<TSource>(this ICollection<TSource> orginalColl,
        IEnumerable<TSource> collectionToAdd)
{
    foreach (var item in collectionToAdd)
    {
        orginalColl.Add(item);
    }
}
于 2012-07-16T07:25:11.557 回答