2012-01-23 3 views
1

메모리 목록 엔티티 중 일부를 .contains (subselect) 쿼리와 비교하여 새 사용자가 오래된 것을 걸러냅니다.이 linq를 객체 쿼리에 최적화하는 방법은 무엇입니까?

성능 문제를 확인 내가 이것을보고 :

enter image description here

새 목록이 쿼리를 최적화 할 수있는 방법이 500 ~ 100까지 다양 동안 oldList 대부분, 그들 주위에있는 1000 명의 사용자를 가지고? 대신 검사의 O (N)으로,

// Change string to whatever the type of UserID is. 
var oldUserSet = new HashSet<string>(oldList.Select(o => o.UserID)); 
var newUsers = NewList.Where(n => !oldUserSet.Contains(n.UserID)) 
         .ToList(); 

HashSet의 수납 확인이 (1) 몇 해시 충돌 가정 O이어야 -

+1

1 개의 대답을 허용합니다. 그걸 개선하고 싶을 수도 있습니다. 또한 어떤 부가 기능이 해당 통계를 제공합니까? – Yuck

+0

vs2010의 성능 프로파일 러를 사용했는데, 최종 버전이 제공됩니다. –

답변

3

절대적 대신 목록 매번 체크 설정 빌드 각 시퀀스는 (새로운 사용자마다)

2

미리 사용자 ID 중 HashSet<T>을 만들 수 있습니다. 그 HashSet<T> 대답은 간단하고 단순하지만

var oldSet = new HashSet<int>(oldList.Select(o => o.UserID)); 
var newUsers = NewList.Where(n => !oldSet.Contains(n.UserID)).ToList(); 
0

가, 일부는 LINQ 중심의 솔루션을 선호 할 수있다 :이 Contains는 O (1) 작업이 될 원인이됩니다.

LinqToObjects는 조인과 GroupJoin을 HashSet으로 구현합니다. 이 중 하나를 사용하십시오.이 예에서는 GroupJoin을 사용합니다 :

List<User> newUsers = 
    (
    from n in NewList 
    join o in oldList on n.UserId equals o.UserId into oldGroup 
    where !oldGroup.Any() 
    select n 
).ToList() 
관련 문제