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);
}
不,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;
}
爱这个新名字......不知道它是谁。 :-P – 2009-11-03 14:26:58
你缺少一个通用的方法参数:) – leppie 2009-11-03 14:27:00
@leppie:刚刚发现,在编辑。 – 2009-11-03 14:27:39
如果我理解正确,您希望将IEnumerable<T>
添加到空集合中。
那岂不是更容易只是做:
ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject());
甚至:
ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList();
我不知道我可以做ICollection,然后做那样的列表。 – 2009-11-03 14:37:34
'List
根据集合类型的源列表的另一种方法是使用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的成员,并且编译器会在查看扩展之前先通过成员函数,但如果我错了我相信有人会纠正我)。
为什么降价? – 2009-11-03 15:33:06