2012-08-06 3 views
3

linq에 대한 기본 문제가 있습니다. 이것은 반복 된 루프로 해결할 수 있지만. 나는 이것이 linq에서 어떻게 할 수 있는지 알고 싶다.다른 목록을 기반으로 목록 조건에서 특정 요소 제거

두 개의 목록이 있습니다.

List<string> a = new List<string>{"a","b","c","d","e","f"}; 
List<string> b = new List<string> { "a", "b", "c", "x", "y", "z" }; 

목록의 a와 b의 어느 요소가 a와 일치하는지 비교하고 싶습니다. 그 요소를 b에서 제거하고 싶습니다. 즉, 목록에서 비교를 기반으로 b에서 { "a", "b", "c"}를 제거하고 목록 b에만 { "x", "y", "z"} 만 포함하려고합니다. 이 문제를 해결하기 위해 단일 진술을 linq 있나요? 당신이 장소에서 수정을해야하는 경우

답변

7

(...이 단지 며칠 전에 다른 게시물의 중복 확신 해요,하지만 난 그것을 찾을 수 없습니다)

, 당신은 List<T>.RemoveAll을 사용할 수 있습니다 :

b.RemoveAll(x => a.Contains(x)); 

또는보다 효율적으로 (목록이 큰 경우) :

HashSet<string> set = new HashSet<string>(a); 
b.RemoveAll(set.Contains); 

주 장소에서 컬렉션을 수정하면 위의 .NET이 목록을 사용하는 이유입니다, LINQ에서 관용적 아니라고 특유의 방법 .

또는 당신은 LINQ 다음 사용할 수 대신 새 목록을 참조 b을 변경 행복 경우 :

b = b.Except(a).ToList(); 
관련 문제