T在课堂上? AddRange ICollection?

时间:2009-11-03 14:22:04

标签: c# .net icollection

我尝试做静态类,添加到icollection但我遇到了一些我似乎无法克服的问题。这就是我如何得到所以我可以在方法中传递ICollection?因为T就是说它无法解决。

然后我想知道有没有办法在icollection上做AddRange?

我在考虑这样的事情,但我觉得我不在乎吗?

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

        return collection.AddRange(list);            
    }

4 个答案:

答案 0 :(得分:16)

不,ICollection<T>没有AddRange方法 - 即使这样做,您也会尝试取消引用null,这会引发NullReferenceException。您尚未指定要将列表添加到的集合......您到底想要做什么?

您可以创建(比方说)一个新的List<T> - 这样做的好处就是已经拥有一个可以使用IEnumerable<T>的构造函数:

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;
}

答案 1 :(得分:4)

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

这样做会不会更容易:

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

甚至:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();

答案 2 :(得分: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的成员,编译器在查看扩展之前会先查看成员函数,但如果我错了,我相信有人会纠正我。)

答案 3 :(得分:0)

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

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

source.Foreach(dest.Add);

但是,此可读性为easy to dispute