T在课堂上? AddRange ICollection?

问题描述:

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

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

我在想这样的事情,但maby我的方式出了我的脑海里呢?

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

     return collection.AddRange(list);    
    } 
+2

为什么降价? – 2009-11-03 15:33:06

不,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; 
} 
+0

爱这个新名字......不知道它是谁。 :-P – 2009-11-03 14:26:58

+0

你缺少一个通用的方法参数:) – leppie 2009-11-03 14:27:00

+0

@leppie:刚刚发现,在编辑。 – 2009-11-03 14:27:39

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

那岂不是更容易只是做:

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

甚至:

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

我不知道我可以做ICollection,然后做那样的列表。 – 2009-11-03 14:37:34

+0

'List '' implements'ICollection 'so yup。 – 2009-11-03 14:42:56

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

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

source.Foreach(dest.Add); 

但是,其可读性为easy to dispute

其他方式似乎认为您的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); 
    } 
} 

注意的是,由于列表impliments ICollection的,直接与List对象时,这可能会引起歧义(虽然我还没有测试过,如果编译器能解决它 - 我的直觉反应是,它应该,因为AddRange是List的成员,并且编译器会在查看扩展之前先通过成员函数,但如果我错了我相信有人会纠正我)。