2014-02-11 6 views
1

의 다른 목록 항목과 비교하여 목록 항목을 제거하는 방법 : 중고 장비 구매 & ListB :나는 다음과 같은 클래스가 동일한 유형

class Detail 
{ 
    public string Name { get; set; } 
    public string State { get; set; } 
    public string City { get; set;} 
    public List<Transaction> tran { get; set; } 
} 

나는 세부 사항 유형의 두 목록을 가지고있다.

ListB에있는 ListA에서 항목을 제거하는 가장 빠른 방법은 무엇입니까?

+0

하나의 세부 인스턴스는 언제입니까? 다른 것과 동등한가요? –

답변

-1

당신은 더 나은 성능으로 다음 코드를 사용하여 수행 할 수 있습니다

var oListBHashSet = new HashSet<Detail>(ListB); 
ListA.RemoveAll(v => oListBHashSet.Contains(v)); 

는 HashSet의이하게 사용하면 빠른 확인이 들어, 한 번만 평가하는 순서를 보장합니다.

0

"가장 빠른"방법은 목록의 크기를 비롯한 다양한 변수에 의존하게됩니다. 다음 항목의 작은 숫자가있는 경우 가장 빠른 방법은 가능성이 간단한 검색됩니다

ListA.RemoveAll(i => !ListB.Contains(i)); 

요소의 높은 숫자가있는 경우 다음 조회 속도를 높이기 위해 HashSet<Detail>처럼 중간 구조를 사용할 수 있습니다 HashSet<Detail> 온 프로세스

var set = nwe HashSet<Detail>(ListB); 
ListA.RemoveAll(i => !set.Contains(i)); 

룩업 List<Detail> 속도보다 상당히 빠르다. 그러나 HashSet<Detail> 값을 구축하는 데 비용이 듭니다. 적은 수의 요소를 처리 할 때 구조를 구축하는 데 시간이 많이 걸릴 수 있습니다. 당신은 단지 당신이 수단 동일을 정의한다 코드

4

먼저 프로파일에 의해 결정될 수있다 위해 어느 하나에, 당신이

var result = ListA.Except(ListB, new Comparer()); 

public class Comparer : IEqualityComparer<Detail> 
{ 

    public bool Equals(Detail x, Detail y) 
    { 
     return x.Name == y.Name 
       && x.State == y.State 
       && x.City == y.City 
       && x.tran.SequenceEqual(y.tran); 
    } 

    public int GetHashCode(Detail obj) 
    { 
     return obj.Name.GetHashCode(); 
    } 
} 

PS 같은 것을 쓸 수 빠릅니다 : 동일한 동등 질문도 마찬가지입니다. Transaction 개체

관련 문제