2013-10-25 55 views
6

我有一个不同的对象集合,我想知道是否可以创建集合组合相同类型的对象。我不知道是否有linq或类似的方法。分组相同类型的集合C#

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 

回答

15

LINQ可以做到这一点很容易返回单个lookup集合:

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

然后,您可以:

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

您可以使用Enumerable.OfType

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

正如在评论中提及了由乔恩斯基特,上面有问题时,有继承的图片(即Object1派生形成对象2)。如果是这样的话,唯一的选择是使用类型

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() 
+0

'='!='=='您的平等运算符是不正确的。 –

+0

@杰里米,错字更正,谢谢指出。 – Tilak

4

一定要比较 -

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

会给你收藏组的集合的类型。

2

你的意思是这样的:

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

+0

请注意,如果(比如说)'Object3'派生自'Object1',那么将不会提供所需的计数。 –

+0

@JonSkeet授予;我们可以明确地查找类型并与'typeof(Object1)'比较,如果是这种情况。无论哪种方式,Linq都是要走的路。 –