2010-08-11 4 views
3

에 하나 개의 목록 만 새 항목을 추가 :내가 두 개의 목록이 다른

나는 모든 _list1에 다른 항목 _list2 추가 할 필요가
List<string> _list1; 
List<string> _list2; 

...

내가 LINQ를 사용하여 그렇게 할 수 있습니까?

감사

답변

9
list1.AddRange(list1.Except(list2)); 
+3

+1 나는 이것이 카를로스 응답보다 훨씬 빠를 것이라고 +1 믿습니다. (그의 대답에 대한 코멘트보기) –

11

당신은 IEnumerable<T>.Union 방법을 사용합니다 :

var _list1 = new List<string>(new[] { "one", "two", "three", "four" }); 
var _list2 = new List<string>(new[] { "three", "four", "five" }); 

_list1 = _list1.Union(_list2); 

// _distinctItems now contains one, two, three, four, five 

편집을

또한 다른 게시물을 사용하는 방법을 사용할 수 있습니다

_list1.AddRange(_list2.Where(i => !_list1.Contains(i)); 

모두의를 이 방법들은 오버 헤드가 추가 될 것입니다.

첫 번째 방법은 새 목록을 사용하여 유니언 결과를 저장 한 다음 다시 결과를 _list1에 할당합니다.

두 번째 방법은 Where의 메모리 내 표현을 만들고 원래 목록에 추가합니다.

독약을 고르십시오. Union은 제 의견으로는 코드를 좀 더 명확하게 보여줍니다. (그리고 적어도 그것이 문제가되고 있음을 증명할 때까지 추가 된 오버 헤드의 가치가 있습니다.)

+0

이 새로운 목록을 만듭니다; _list1에 아무 것도 추가하지 않습니다. – Gabe

+0

@Gabe - 문제가 해결되었습니다. –

+0

@ 카를로스 - 이것을 사용하지 않는 구체적인 이유는 무엇입니까? –

5
_list1.AddRange(_list2.Where(x => !_list1.Contains(x))); 
+1

O (n^2)에서 실행되지 않습니까? 이상적으로 그것은 비교 정렬을 위해 O (n * log (n)) 인 정렬보다 느려서는 안됩니다. –

+0

@ lasseespeholt 목록 정렬 여부를 확신 할 수 없습니다. –

+0

@Carlos 그건 내가 말하는 것이 아닙니다. 표현식의 성능은 O (n * m)이라고 생각합니다. 여기서 n은 list1.Length이고 m은 list2.Length입니다. O (n * log n)에서 수행 할 수있는 정렬보다 느려서는 안됩니다. 목록과 정렬을 연결하면 O (n) 시간에 중복을 제거 할 수 있으므로 O (n * log n). –

관련 문제