2014-07-25 2 views
0

2 개의 목록이 있습니다. 하나는 수퍼 세트이고 다른 하나는 서브 세트입니다. 내가 원하는 것은 ID를 기반으로 하위 집합에있는 수퍼 집합의 모든 항목을 삭제하는 것입니다.LINQ를 사용하는 기준에 따라 SuperSet에서 서브 세트 제거

이것은 내가 지금하는 일이다 : 나는 오히려이 사용 LINQ를하는 것보다 이것을 달성하기 위해 짧은 방법이 확신

var newList = new List<Items>(); 
foreach(var row in superset) 
{ 
    var presentInSubset = subset.Any(r => r.ID == row.ID); 

    if(!presentInSubset) 
    { 
    newList.Add(row) 
    } 
} 

superset = newList; 

. 질문 : 일부 기준에 따라 수퍼 집합에서 하위 집합을 제거하려면 어떻게해야합니까?

감사합니다, - 마이크

답변

4
superset.RemoveAll(x => subset.Select(y => y.ID).Contains(x.ID)); 
+0

+1 이제 작동 중입니다. 이것은 짧고 읽기 쉽고 효율적입니다. –

2
var cleanList = superSet.Where(s => !subSet.Any(sub => sub.ID == s.ID)).ToList(); 

위를보십시오. 하지만 원래 목록은 변경되지 않습니다. 대신 새로운 정리 목록을 반환합니다.

1

또 다른 (효율적으로) 접근 방식은 당신이 필요로하는, Enumerable.Join을 사용하는 것입니다 "왼쪽 외부 조인"당신이 원하기 때문에 하위에 있지 않은 모든 슈퍼에서이 샘플 데이터로

var inSuper = from iSuper in superset 
       join iSub in subset 
       on iSuper.ID equals iSub.ID into gj 
       from subJoin in gj.DefaultIfEmpty() 
       where subJoin == null 
       select iSuper; 
superset = inSuper.ToList(); 

:

var superset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=2}, new Items{ID=3}, 
}; 
var subset = new List<Items>() { 
    new Items{ID=1}, new Items{ID=4}, new Items{ID=3}, 
}; 

ID가 2 인 항목 만이 부분 집합에 속하지 않기 때문에 그대로 유지됩니다.

관련 문제