8

我有一个不同对象的集合,我想知道是否可以创建对相同类型对象进行分组的集合。我不知道是否有 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 
4

4 回答 4

19

LINQ 可以很容易地返回单个查找集合:

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

然后您可以:

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

当然 -

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

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

于 2013-10-25T13:25:50.987 回答
4

您可以使用Enumerable.OfType

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

正如 Jon skeet 在其中一条评论中提到的,当图片中存在继承时(即 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()
于 2013-10-25T13:25:49.427 回答
2

你的意思是这样的:

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

?

于 2013-10-25T13:26:21.733 回答