【问题标题】:T in class? AddRange ICollection?T 上课?添加范围 ICollection?
【发布时间】:2010-12-12 15:53:59
【问题描述】:

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

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

我一直在想这样的事情,但我可能想不通?

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

        return collection.AddRange(list);            
    }

【问题讨论】:

    标签: c# .net icollection


    【解决方案1】:

    不,ICollection&lt;T&gt; 没有 AddRange 方法 - 即使有,您也会尝试取消引用 null,这将引发 NullReferenceException。您还没有指定要添加列表的集合...您到底想做什么?

    你可以创建(比如说)一个新的List&lt;T&gt;——这样做的好处是已经有了一个可以接受IEnumerable&lt;T&gt;的构造函数:

    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
    • 您缺少通用方法参数 :)
    • @Joel:因此“那时你真的只是重新实现了 Enumerable.ToList() 并赋予它不同的返回类型......”:)
    • 在 .Net 4.0 List&lt;T&gt; 有一个 AddRange 方法 - 还有 InsertRange, RemoveRange ...实际上,MSDN 显示它在 3.5 中可用
    • @IAbstract:当然,但这是给ICollection&lt;T&gt;,而不是List&lt;T&gt;
    【解决方案2】:

    如果我理解正确,您想将 IEnumerable&lt;T&gt; 添加到空集合中。

    这样做不是更容易吗:

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

    甚至:

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

    【讨论】:

    • 我不知道我可以做一个 ICollection 然后做这样的列表。
    • List&lt;T&gt; 实现了ICollection&lt;T&gt; 所以是的。
    【解决方案3】:

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

    List<string> source = ...
    ICollection<string> dest = ...
    
    source.Foreach(dest.Add);
    

    不过,这个可读性是easy to dispute

    【讨论】:

      【解决方案4】:

      其他方法似乎假设您的 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 的成员,编译器在查看扩展之前会先检查成员函数,但如果我错了,我相信有人会纠正我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 2015-03-12
        • 2014-01-26
        • 2010-12-05
        相关资源
        最近更新 更多