繁体   English   中英

T在课堂上? AddRange ICollection?

[英]T in class? AddRange ICollection?

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

然后我想知道有没有办法在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;
}

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

这样做会不会更容易:

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

甚至:

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

其他方式似乎假设您的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 impliments ICollection,这可能会在直接处理List对象时引起歧义(虽然我还没有测试过,如果编译器能够解决它 - 我的直觉反应是它应该,但是,因为AddRange是List的成员,编译器将在查看扩展之前先查看成员函数,但如果我错了,我相信有人会纠正我。

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

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

source.Foreach(dest.Add);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM