2014-07-09 3 views
0

람다 (x => x.ID.Equals (newItem.ID))가있는 oldItem을 찾을 수 없습니다 - 제네릭이므로. ID와 같은 또 다른 매개 변수를 제공하고 리플렉션을 통해 속성 값을 얻으려고 사용할 수 있습니다. 그러나 실제로이 방법이 더 좋은 방법입니까?두 개의 일반 목록에서 동일한 속성 찾기

private void LogDiff<T>(HashSet<T> newList, HashSet<T> oldList) 
{ 
    Parallel.ForEach(newList, newItem => 
    { 
     var oldItem = oldList.FirstOrDefault(x => x.ID.Equals(newItem.ID)); 
     if (oldItem!= null) 
     { 
      //Yay i found my item 
     }); 
} 

답변

1

아니, 당신은 일반적으로 다른 매개 변수를 통해 ID 투영을 제공하는 것 :

// Parameters renamed as they're not lists... 
private void LogDiff<T, TKey>(HashSet<T> newItems, HashSet<T> oldItems, 
           Func<T, TKey> keySelector) 
{ 
    var comparer = EqualityComparer<TKey>.Default; 
    Parallel.ForEach(newItems, newItem => 
    { 
     var newKey = keySelector(newItem); 
     var oldItem = oldList.FirstOrDefault(x => comparer.Equals(newKey, keySelector(x)); 
     if (oldItem != null) 
     { 
      // Use the item 
     } 
    }); 
} 

그러나, 그것은 단지 Join를 사용 비해 상당히 비효율적 - 여전히 병렬로 수행 할 수있는 :

+0

멋진 솔루션 @ 존 스키트에서 들리는군요.이 영역에서 강하지는 않습니다.이 메소드가 어떻게 불려지는지 알려주세요. 예를 들어, 내 T 객체의 ex ID로 Func을 정의한 방법을 보여줄 수 있습니까? – MacGyver

+0

@MacGyver : 발신자가 지정합니다. LogDiff (newItems, oldItems, x => x.ID)' –

+0

작동하지 않을 수 있습니다 - 잘못된 인수가 무엇인지, 잘못된 점을 알고 있습니까? – MacGyver

관련 문제