2011-08-03 1 views
2

두 EntityCollections가 동일한 지 확인해야합니다. 트릭을 수행 할 것이라고 생각하는 코드가 있지만 더 효율적인 알고리즘이 있는지 궁금합니다. EntityCollections에는 각각 10 개 미만의 요소가있을 수 있습니다.두 EntityCollection에 동일한 요소가 포함되어 있는지 확인하는 더 효과적인 방법이 있습니까?

private static bool isEquivalent(
     EntityCollection<MyClassDetails> myClassDetails1, 
     EntityCollection<MyClassDetails> myClassDetails2) 
    { 
     var myClassComparer = new MyClassComparer(); 

     return 
      myClassDetails1.All(
       myClassDetail1 => 
       myClassDetails2.Contains(
        myClassDetail1, myClassComparer)); 
    } 

    class MyClassComparer : IEqualityComparer<MyClassDetails> 
    { 
     public bool Equals(MyClassDetails details1, MyClassDetails details2) 
     { 
      return details1.DetailID == details2.DetailID; 
     } 

     public int GetHashCode(MyClassDetails obj) 
     { 
      return obj.GetHashCode(); 
     } 
    } 
+0

두 개의 콜렉션이 비어 있는지 여부가 결정되지 않습니까? – dlev

+0

예, 믿습니다. – Don

답변

0

여러분의 콜렉션이 10 개 요소 만 보유하고 있다면,이 알고리즘의 효율성을 걱정하는 것은시기 상조 일 것입니다. 중요한 경로에서 많은 것을 호출하지 않는 한 말입니다. 하지만 시도 할 수있는 한 가지 방법은 교차 및 모든 확장을 대신 사용하는 것입니다.

return !myClassDetails1.Intersects(myClassDetails2, new MyClassComparer()).Any(); 

얼마나 효율적인지는 모르겠지만 코드는 더 예뻤습니다. 또한, 과거에는 그러한 기회를 위해 FuncComparer를 만들었습니다.

class FuncComparer<T> : IEqualityComparer<T> 
{ 
    private Func<bool, T, T> compare; 
    public FuncComparer(Func<boo, T, T> compare){ 
    this.compare = compare; 
    } 
    public bool Equals(T left, T right) { 
    return this.compare(left, right); 
    } 
} 

// usage 
return !items1 
    .Intersects(items2, new FuncComparer<Item>((l, r) => l.Id == r.Id)) 
    .Any(); 
+0

FuncComparer에 대해 gethashcode를 구현하면 안됩니까? – saus

+0

나는이 해결책이 마음에 드는데, 이는 아마도 @ dlev의 코멘트가 암시 한 것일 것입니다. 나는 항상 모든 요소를 ​​반복하므로 요소의 수가 적기 때문에 덜 효과적 일 것이라고 생각한다. – Don

+0

이것은 실패한 경우 모든 요소를 ​​반복해서는 안됩니다. 관심 항목에서 하나의 항목이 반환되면 Any()가 즉시 멈추고 계속 반복하지 않습니다. 또한 intersects가 반환되기 전에 완전히 반복 할 필요는 없습니다. 그것은 공동 작업의 힘입니다. –

0

주 루프 (.All)를 통해 매번 배열을 탐색 할 것입니다. linq을 사용하여 정렬하면 (orderby) 한 목록을 반복하고 다른 목록의 동일한 색인에있는 항목과 항목을 비교할 수 있습니다. 사실 차이가 발생하자마자 false을 반환 할 수 있습니다.

+0

좋은 지적입니다. 두 컬렉션 모두에 대해 서버 OrderBy DetailID를 사용할 수 있다면 차이점을 발견하자마자 반환 할 수 있습니다. – Don

+2

아니요, All() 메서드는 첫 번째 오류가 발생한 후 반복을 중지합니다. –

+0

서버가 목록을 주문하면 Contains의 성능이 향상됩니까? –

관련 문제