2013-10-25 3 views
6

У меня есть набор объектов differents, и я хочу знать, могу ли я создавать коллекции, группирующие объекты одного и того же типа. Я не знаю, есть ли метод с 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()); 

Вы можете затем:

  • Идите по нему, чтобы найти все 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

@Jeremy, Typo исправлено, спасибо, что указали его. – Tilak

4

Sure -

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

Даст вам коллекцию группы коллекций по типу.

2

Вы имеете в виду, как это:

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

?

+0

Обратите внимание, что если (скажем) 'Object3', полученный из' Object1', это не даст требуемого счета. –

+0

@ JonSkeet предоставлен; можно явно просмотреть тип и сравнить с «typeof (Object1)», если это так. В любом случае, Linq - это путь. –

Смежные вопросы