8

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

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

我在想这样的事情,但也许我已经疯了?

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

        return collection.AddRange(list);            
    }
4

4 回答 4

17

不,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;
}
于 2009-11-03T14:24:47.057 回答
4

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

这样做会不会更容易:

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

甚至:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();
于 2009-11-03T14:27:08.817 回答
1

其他方法似乎假设您的 ICollection 是空的和/或您的 ICollection 是一种列表。但是,如果您想要 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 的成员,编译器在查看扩展之前会先检查成员函数,但如果我错了,我相信有人会纠正我的)。

于 2013-01-08T21:42:15.693 回答
0

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

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

source.Foreach(dest.Add);

但是,这种可读性很容易引起争议

于 2012-07-27T10:33:05.997 回答