2015-03-24 2 views
0

У меня есть код, ожидающий ICollection. Теперь я хочу разделить эту коллекцию на более мелкие куски, группируя их на основе данного атрибута (все элементы в моей коллекции являются экземплярами абстрактного базового класса, однако для устаревшего кода мы не используем общую версию этого интерфейса). Поэтому я хотел бы получить список перечислимых списков (по одному для каждой группы). Для этого я планировал преобразовать ICollection в общий IEnumerable<T> с использованием Cast<T> -метода на ICollection, а затем построить словарь из этого IEnumerable<T> с использованием LINQ-запроса. Но я упал, может быть, есть некоторые более подходящие подходы. У вас есть?Работа с ICollection и IEnumerable <T>

public override void DoSomething(ICollection features) 
{ 
    var grp = features.Cast<MyBaseClass>().GroupBy(x => x.table); 
    foreach(var g in grp) base.DoSomething(g); 
} 

EDIT: Таким образом, базовый метод (конечно) имеет такое же Signatur (также ожидает, что экземпляр ICollection), как я могу получить значение групп обратно к (необщему) ICollection?

+2

Предоставьте нам код, который, по вашему мнению, не лучший способ. Также обратите внимание, что вы должны задать такой вопрос на http://codereview.stackexchange.com/. –

+1

Поскольку вы рассматриваете LINQ: вы нашли метод расширения .OfType 'extension? – CompuChip

+0

@CompuChip Я заметил это, но никогда не использовал его. Отличная идея. – HimBromBeere

ответ

2

Я не думаю, что нет ничего плохого с вашим подходом, но есть один нюанс: если экземпляр ICollection содержит элемент, который не типа MyBaseClass, вы получите исключение произнесения. Вы можете обойти это с помощью метода расширения OfType, который проверяет, действительно ли элемент имеет тип, и если да, то он передает его целевому типу. Если элемент имеет другой тип, он просто игнорируется и не генерируется исключение.

public override void DoSomething(ICollection features) 
{ 
    var grp = features.OfType<MyBaseClass>().GroupBy(x => x.table); 
    foreach(var g in grp) base.DoSomething((ICollection)g.ToList()); 
} 

Вы можете увидеть рабочий пример здесь: https://dotnetfiddle.net/0VkedY

Конечно, если ваше требование является то, что все элементы должны быть определенного типа, вы должны использовать Cast вместо OfType.

+3

Однако, если вы ожидаете, что данные будут иметь определенный тип, было бы лучше использовать 'Cast', чтобы найти какие-либо ошибки как можно скорее. – Default

+0

@HimBromBeere Я обновил свое решение –

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