2012-06-06 4 views
3

두 개의 IList<CustomObject>이 있습니다. 여기에서 CustomObjectName 속성이 있으며 string입니다. 첫 번째 전화는 set이고 두 번째 전화는 subset입니다. set에는 다중 선택 목록 상자에서 방금 사용자에게 표시 한 목록이 포함되어 있습니다. 선택한 사용자가 subset에 배치 된 것들 (그래서 subsetset의 부분 집합, 따라서 영리 이름이 보장된다)를 포함, 세 번째 IList<CustomObject>, inverseSubset를 생성하는 가장 간단한 방법은 무엇)목록의 어떤 요소가 다른 목록에 없는지 확인

모든 이 두 세트에서 사용자가 선택하지 않은 CustomObjects?

내가 대답을 막연하게 비슷한 질문을 기반으로 ...이

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

같은 LINQ의 일을 시도했습니다,하지만 지금까지 아무도, 훨씬 적은 작업을 컴파일되지 않습니다 : P

답변

7

사용을 LINQ Except for this :

두 시퀀스의 차이를 만듭니다. -

+0

그가'IEquatable '제네릭 인터페이스를 구현하고 제공해야 말을 도움이 될 것입니다 'CustomObject'에 대한 자신의'GetHashCode'와'Equals' 메쏘드. –

+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

OK, 그것은 '예외'만큼 매끄럽지는 않지만, 왜 투표를하지 않습니까? 실제로 Name 속성에서만 필터링해야한다면 Except가 작동하지 않을 것이라고 생각합니까? –

관련 문제