我尝试做静态类,添加到icollection但我遇到了一些我似乎无法克服的问题。这就是我如何得到所以我可以在方法中传递ICollection?因为T就是说它无法解决。
然后我想知道有没有办法在icollection上做AddRange?
我在考虑这样的事情,但我觉得我不在乎吗?
public static ICollection<T> add(this IEnumerable<T> list)
{
ICollection<T> collection = null;
return collection.AddRange(list);
}
答案 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。