【问题标题】:Grouping collections of the same type C#将相同类型的集合分组 C#
【发布时间】:2013-11-04 15:33:21
【问题描述】:

我有一个不同对象的集合,我想知道是否可以创建对相同类型对象进行分组的集合。不知道有没有linq之类的方法。

List<Object> list = new List<Object>();
Object1 obj1 =  new Object1();
Object2 obj2 =  new Object2();
Object1 obj3 =  new Object1();
Object3 obj4 =  new Object3();
Object3 obj5 =  new Object3();

list.Add(obj1);
list.Add(obj2);
list.Add(obj3);
list.Add(obj4);
list.Add(obj5);

我想要相同类型的新列表:

List<Object1> newList1 = method.GetAllObjectsFromListObject1 // Count = 2
List<Object2> newList2 = //GetAllObjectsFromListObject2 // Count = 1
List<Object3> newList3 = //GetAllObjectsFromListObject3 // Count = 2 

【问题讨论】:

    标签: c# .net linq list select


    【解决方案1】:

    LINQ 可以非常轻松地返回单个 lookup 集合:

    var lookup = list.ToLookup(x => x.GetType());
    

    然后你可以:

    • 遍历它以查找所有类型和关联对象
    • 使用索引器获取特定类型的所有项目。如果您指定的类型在查找中不存在,这将返回一个空序列(这非常有用,而不是抛出异常或返回 null)。

    【讨论】:

      【解决方案2】:

      你可以使用Enumerable.OfType

      var newList1 = list.OfType<Object1>().ToList()
      var newList2 = list.OfType<Object2>().ToList()
      var newList3 = list.OfType<Object3>().ToList()
      

      正如 Jon skeet 在其中一个 cmets 中提到的,当图片中存在继承时(即 Object1 从 Object2 派生),上述问题会出现。如果是这种情况,唯一的选择是使用类型进行比较

      var newList1 = list.Where(t=>t.GetType() == typeof(Object1)).ToList()
      var newList2 = list.Where(t=>t.GetType() == typeof(Object2)).ToList()
      var newList3 = list.Where(t=>t.GetType() == typeof(Object3)).ToList()
      

      【讨论】:

        【解决方案3】:

        当然-

        list.GroupBy(t => t.GetType());
        

        将按类型为您提供集合的集合。

        【讨论】:

          【解决方案4】:

          你的意思是这样的:

          var newList1 = list.OfType<Object1>().ToList();
          

          ?

          【讨论】:

          • 请注意,如果(比如)Object3 派生自 Object1,则不会给出所需的计数。
          • @JonSkeet 授予;如果是这种情况,可以显式查找类型并与typeof(Object1) 进行比较。无论哪种方式,Linq 都是必经之路。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-02
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多