2012-06-06 1 views
3

У меня есть два IList<CustomObject>, где CustomObject имеет свойство Name, которое является string. Вызвать первый set, а второй subset. set содержит список вещей, которые я только что отображал пользователю в окне многосегментного списка. Те, выбранные пользователем, были помещены в subset (так subset гарантированно будет подмножеством set, следовательно, умные имена;))Определите, какие элементы в списке НЕ находятся в другом списке

Самый простой способ создания третьего IList<CustomObject>, inverseSubset, содержащий все CustomObjects, который пользователь НЕ выбрал, из этих двух наборов?

Я пытался LINQ вещи как этот

IEnumerable<CustomObject> inverseSubset = set.Select<CustomObject,CustomObject>(
    sp => !subset.ConvertAll<string>(p => p.Name).Contains(sp.Name)); 

... на основе ответов на подобные вопросы неопределенно, но до сих пор ничего не даже компиляции, гораздо меньше работать: P

ответ

7

Используйте форму LINQ Except для этого:

Производит заданное различие двух последовательностей.

+0

Было бы полезно, чтобы сказать, что он должен реализовать IEquatable '' общий интерфейс и обеспечить его собственные методы GetHashCode и 'Equals' для' CustomObject'. –

+1

На самом деле, поскольку оба набора содержат ссылки на те же объекты, я этого не делал. 'IEnumerable inverseSubset = set.Except (подмножество);' работал отлично. –

-1

Ага, слишком много SQL недавно - я не хотел Select, я хотел Where:

List<string> subsetNames = subset.ConvertAll<string>(p => p.Name); 
IEnumerable<CustomObject> inverseSubset = 
    set.Where<CustomObject>(p => !subsetNames.Contains(p.Name)); 
+0

ОК, это не так гладко, как 'Except', но почему голосование? Если мне действительно нужно было фильтровать только свойство Name, я не думаю, что Except будет работать, не так ли? –

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

  • Нет связанных вопросов^_^