我想将新的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)。 但这似乎不起作用。有什么想法吗?
答案 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);
}
}