2017-05-22 2 views
0

하여 목록을 필터링합니다 :어떻게 두 개의 목록이 다른 목록

List<myObject> mainList; 

그리고이 조건에 의해 새 목록을 만들려고 노력하고있어

List<myObject> blackList; 

다른 조건을 요소가해야 블랙리스트에 없다. 가 여기 내 시도 :

List<myObject> newList = mainList.Where(x => x.Id == 5 && !blackList.Contains(x)).ToList(); 

newList하는 것은 루프 내부에서 발생되는 루프의 첫 번째 라운드에서, blackList이 비어 있으며 blackList 약 200K 요소가 포함 된 두 번째 라운드에서, 작동합니다. 그리고 위의 행이 작동하면 다음 단계로 이동하지 않고 몇 분 동안 그대로 있습니다. blackList에있는 요소를 가져 오지 않도록 필터링을보다 효율적으로 수행하려면 어떻게해야합니까? 감사.

+1

같은 긴 목록에 대한 빠른/더 나은 구현 '대신'목록 '의'HashSet의 채우기 . 'GetHashCode'는'Equals' (어쨌든 추천되는 것)뿐만 아니라 오버라이드 (override)해야합니다. –

답변

3

List<T>Contains을 구현하는 방식으로 인해 문제가 발생합니다. 긴 목록에서는 매우 느리고 비효율적입니다.

당신이 블랙리스트에 대한 더 나은 구조를 사용할 수있는 더 나은 성능을 얻으려면 - 하나를 HashSet<T>

var blackList = new HashSet<myObject>(theBlackList); 
+0

다른 컬렉션을 사용하는 생성자를 사용하는 대신 해시 세트를 직접 채울 수 있습니다. –

+0

필터링에 해시 집합을 어떻게 사용합니까? 그리고 어떻게 해시 셋 안에 아이템을 추가 할 것인가? – jason

+0

@jason : 동일한 방식으로 코드가 변경되지 않습니다. –

관련 문제