Dla wyjaśnienia, spojrzeć na inne odpowiedzi. Podaję tylko jeden sposób na poradzenie sobie z tym problemem.
może Lubisz this:
public class LambdaComparer<T>:IEqualityComparer<T>{
private readonly Func<T,T,bool> _comparer;
private readonly Func<T,int> _hash;
public LambdaComparer(Func<T,T,bool> comparer):
this(comparer,o=>0) {}
public LambdaComparer(Func<T,T,bool> comparer,Func<T,int> hash){
if(comparer==null) throw new ArgumentNullException("comparer");
if(hash==null) throw new ArgumentNullException("hash");
_comparer=comparer;
_hash=hash;
}
public bool Equals(T x,T y){
return _comparer(x,y);
}
public int GetHashCode(T obj){
return _hash(obj);
}
}
Zastosowanie:
public void Foo{
public string Fizz{get;set;}
public BarEnum Bar{get;set;}
}
public enum BarEnum {One,Two,Three}
var lst=new List<Foo>();
lst.Distinct(new LambdaComparer<Foo>(
(x1,x2)=>x1.Fizz==x2.Fizz&&
x1.Bar==x2.Bar));
Można nawet owinąć go wokół, aby uniknąć pisania głośny new LambdaComparer<T>(...)
rzecz:
public static class EnumerableExtensions{
public static IEnumerable<T> SmartDistinct<T>
(this IEnumerable<T> lst, Func<T, T, bool> pred){
return lst.Distinct(new LambdaComparer<T>(pred));
}
}
Zastosowanie:
lst.SmartDistinct((x1,x2)=>x1.Fizz==x2.Fizz&&x1.Bar==x2.Bar);
Uwaga: działa niezawodnie tylko dla Linq2Objects
To działało świetnie. Dzięki. –
Proszę nie odpowiadać, po prostu łącząc. Uwzględniono odpowiedni kod w odpowiedzi. –
Tak, już tego nie robię, ale w 2010 roku nie zwracałem uwagi na tę praktykę. – Stilgar