【发布时间】:2010-12-01 06:50:09
【问题描述】:
今天一位同事问我如何将范围添加到集合中。他有一个继承自Collection<T> 的类。该类型的 get-only 属性已经包含一些项目。他想将另一个集合中的项目添加到属性集合中。他怎么能以 C#3 友好的方式做到这一点? (请注意关于 get-only 属性的限制,它会阻止像执行 Union 和重新分配这样的解决方案。)
当然,带有属性的 foreach。添加将起作用。但是List<T> 风格的 AddRange 会优雅得多。
编写扩展方法很容易:
public static class CollectionHelpers
{
public static void AddRange<T>(this ICollection<T> destination,
IEnumerable<T> source)
{
foreach (T item in source)
{
destination.Add(item);
}
}
}
但我感觉我正在重新发明轮子。我在System.Linq 或morelinq 中没有找到类似的东西。
糟糕的设计?只需调用添加?缺少明显的东西?
【问题讨论】:
-
请记住,来自 LINQ 的 Q 是“查询”,实际上是关于数据检索、投影、转换等。修改现有集合确实不属于 LINQ 的预期目的范围,这就是为什么LINQ 没有为此提供任何现成的东西。但是扩展方法(尤其是您的示例)将是理想的选择。
-
一个问题,
ICollection<T>好像没有Add方法。 msdn.microsoft.com/en-us/library/… 不过Collection<T>有一个。 -
@TimGoodman - 这是非通用接口。见msdn.microsoft.com/en-us/library/92t2ye13.aspx
-
“修改现有集合确实不属于 LINQ 的预期目的范围”。 @Levi 那么为什么首先要有
Add(T item)呢?提供添加单个项目的能力,然后期望所有调用者迭代以便一次添加多个项目,这似乎是一种半生不熟的方法。你的说法对IEnumerable<T>肯定是正确的,但我发现自己对ICollections感到沮丧不止一次。我不反对你,只是发泄一下。
标签: c# collections c#-3.0 extension-methods