2012-03-30 1 views
2

모두, 일치하는 값이 List<T> 인 두 가지 방법 (List<T>)을 얻는 더 좋은 방법이 있는지 알고 싶습니다.목록 얻기 <T> 두 개의 분리 목록에서 일치 <T>

다른리스트에있는 itemList<string> (별개 목록)의 모든 항목을 찾으려면이 방법을 사용하십시오. bankList<string> (반환되는 목록도 별개이므로 중복되지 않음)이됩니다.

List<string> matchingList = new List<string>(); 
foreach (string s in itemList) 
    if (bankList.Contains(s)) 
     matchingList.Add(s); 

이렇게하는 것이 더 빠르고 쉬운 방법이 있습니까?

확장 : 나는 질문에 답하고있다 (이것은 활용하고)하지만 관심의 부족, 부정을 얻을 수있는 가장 좋은 방법은 (즉, 해당 항목 하지 bankList<string>에서)이 될 것 감사

List<string> interList = new List<string>(); 
interList = itemList.Intersect(bankList).ToList<string>(); 
matchingList = itemList.Except(interList).ToList<string>(); 

또는이 경우 는 다시

나는 그것을 흥미롭게도 후자가 될 수이 경우에 생각
List<string> matchingList = new List<string>(); 
foreach (string s in itemList) 
    if (!bankList.Contains(s)) 
     matchingList.Add(s); 

하는 것? 이 O(n^2)을 수 없기 때문에, 또한

var matchingList = itemList.Intersect(bankList).ToList(); 

, 그것은 빨라집니다 :

+0

이 두 번째 질문에 대한 내 편집을 참조하십시오 말할 것이다. 일반적으로 새로운 질문을 편집하는 대신 새로운 질문을해야합니다. 질문에 대한 대답을 수락하면 대부분의 사람들은주의를 기울이지 않을 것입니다. – jason

답변

16

이 할 수있는 명확 방법이있다. 지금은 itemList에있는 모든 항목에 대해 bankList을 트래버스하고 있습니다. 대신, 당신은 을 itemList에서 건설해야하고 bankList을 걸을 때 그 봉쇄가 HashSet에 있는지 확인해야합니다. 그게 바로 Enumerable.Intersect의 역할입니다.

그래서 성능과 가독성 모두에서 승리합니다.

는 부정을 얻는 가장 좋은 방법은 (즉,하지 bankList에서 그 항목)

그냥

var except = itemList.Except(bankList).ToList(); 
+2

실제로 이것은'Intersect'가 내부적으로 Hashset을 사용하기 때문에 더 빠를 것입니다 - OP의 접근 방식은 O (n^2)입니다 – BrokenGlass

+0

예, 방금 편집했습니다. – jason

+0

+1 니스! 전에는 보지 못했지만, 현재 C#으로 무대에 올라서면서 점차적으로 많은 '숨겨진'(대부분의 경우 더 나은) 방법을 배웁니다. 시간 내 줘서 고마워. – MoonKnight

관련 문제