T in class? AddRange ICollection?

8

我想创建一个静态类,并将其添加到icollection中,但我遇到了一些无法克服的问题。我该如何在方法中传递一个ICollection?因为T不能被解析。

然后我想知道是否有一种方法可以在icollection上执行AddRange操作?

我考虑过像这样的东西,但可能有些疯狂了?

public static ICollection<T> add(this IEnumerable<T> list)
    {
        ICollection<T> collection = null;

        return collection.AddRange(list);            
    }
4个回答

17
不,`ICollection` 没有 `AddRange` 方法 - 即使有,你也会尝试解除引用 `null`,这将抛出 `NullReferenceException`。你没有指定要将列表添加到哪个集合中... 你究竟想做什么?
你可以创建一个新的 `List` - 它已经具有可以接受 `IEnumerable` 的构造函数的优点:
public static ICollection<T> Add<T>(this IEnumerable<T> list)
{
    return new List<T>(list);            
}

然而,此时你只是重新实现了Enumerable.ToList()并给它赋予了不同的返回类型...

如果你想将所有内容添加到一个现有的集合中,你可能需要像这样的代码:

public static ICollection<T> AddTo<T>(this IEnumerable<T> list,
                                      ICollection<T> collection)
{
    foreach (T item in list)
    {
        collection.Add(item);
    }
    return collection;
}

喜欢这个新名字...我也不知道是谁。:-P - Justin Niessner
您缺少一个通用方法参数 :) - leppie
在 .Net 4.0 中,List<T> 类型有一个 AddRange 方法 - 同样也有 InsertRangeRemoveRange ... 实际上,MSDN 上显示它在 3.5 版本中就已经可用了。 - IAbstract
已经注意到了 :) ...由于List<T>实现了ICollection<T>,我认为这很相关。 - IAbstract
这样写不是更好吗?public static Q AddTo<T,Q>(this IEnumerable<T> list, Q collection) where Q : ICollection<T>。如果你想保持输入和输出类型相同,这将有助于链接。 - bradgonesurfing
显示剩余2条评论

4

如果我理解正确,您想将 IEnumerable<T> 添加到一个空集合中。

那么,直接这样做不是更容易吗:

ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject());

甚至可以这样:
ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();

我不知道我可以这样做一个ICollection然后再转成List。 - Dejan.S
List<T> 实现了 ICollection<T>,所以没错。 - Yannick Motton

1
其他方法似乎假定您的ICollection为空和/或您的ICollection是List类型。但是,如果您想要AddRange,则可以按如下方式扩展ICollection类:
public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie)
{
    foreach (T obj in ie)
    {
        ic.Add(obj);
    }
}

请注意,由于List实现了ICollection接口,因此在直接处理List对象时可能会产生歧义(尽管我还没有测试编译器是否能解决此问题-我的直觉是应该可以,因为AddRange是List的成员函数,编译器将首先执行成员函数,然后再查看扩展,但如果我错了,我相信有人会纠正我)。

0

根据您的源列表的集合类型,另一种方法是使用 List(T).ForEach,例如:

List<string> source = ...
ICollection<string> dest = ...

source.Foreach(dest.Add);

然而,这种可读性很容易引起争议


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接