2013-06-09 6 views
0

, 나는 교차 기능을 사용할 수 있습니다속성 값에 따라 공통 요소를 선택하는 방법은 무엇입니까? 나는이 목록의 공통 요소를 원하는 경우

var listC = listA.Intersect(listB); 

을하지만이 객체를 비교합니다. 목록에 Persons 유형의 객체가 있고 예를 들어 같은 이름을 가진 사람을 얻고 싶다면 어떻게 할 수 있습니까? 이름 속성의 조건을 어디에 설정 했습니까?

감사합니다.

+5

이것은 몇 분 안에 세 번째 질문입니다. 시도해 보셨습니까? – Sayse

+1

사용자 정의'IEqualityComparer '로 오버로드 된 버전을 사용하십시오. [MSDN] (http://msdn.microsoft.com/en-us/library/bb355408.aspx)을보십시오 – Zbigniew

+0

google "C# linq"로 입력 할 수 있습니까? – Dennis

답변

3

고객 맞춤 IEqualityComparer<T>을 전달하십시오.

첫째, 해당 인터페이스를 구현하는 클래스 만들기 : 다음

public class PersonNameEqualityComparer:IEqualityComparer<Person> 
{ 
    public int GetHashCode (Person obj) 
    { 
     return obj.Name.GetHashcode(); 
    } 
    public bool Equals (Person x, Person y) 
    { 
     return x.Name == y.Name; 
    } 
} 

을, 당신이 할 필요가 교차 방법에 그 IEqualityComparer의 인스턴스를 전달합니다.

var result = listA.Intersect(listB, new PersonNameEqualityComparer()); 

당신은 제네릭과 람다 사용하여 모든 개체 및 속성이 확장 할 수 : 당신은 그럼 그냥 이런 식으로 사용할 수

public class PropertyEqualityComparer<TObject, TProperty> : IEqualityComparer<TObject> 
{ 
    Func<TObject, TProperty> _selector; 
    IEqualityComparer<TProperty> _internalComparer; 
    public PropertyEqualityComparer(Func<TObject, TProperty> propertySelector, IEqualityComparer<TProperty> innerEqualityComparer = null) 
    { 
     _selector = propertySelector; 
     _internalComparer = innerEqualityComparer; 
    } 
    public int GetHashCode(TObject obj) 
    { 
     return _selector(obj).GetHashCode(); 
    } 
    public bool Equals(TObject x, TObject y) 
    { 
     IEqualityComparer<TProperty> comparer = _internalComparer ?? EqualityComparer<TProperty>.Default; 
     return comparer.Equals(_selector(x), _selector(y)); 
    } 
} 

을 :

var result = listA.Intersect(listB, new PropertyEqualityComparer<Person, string>(p => p.Name)); 

또는 같은 :

var result = listA.Intersect(listB, new PropertyEqualityComparer<Person, string>(p => p.Age)); 

nd 등등.