Pour plus d'explications, jetez un oeil à d'autres réponses. Je ne fais que fournir un moyen de gérer ce problème.
Vous aimerez 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);
}
}
Utilisation:
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));
Vous pouvez même l'enrouler autour d'éviter d'écrire chose new LambdaComparer<T>(...)
bruyante:
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));
}
}
Utilisation:
lst.SmartDistinct((x1,x2)=>x1.Fizz==x2.Fizz&&x1.Bar==x2.Bar);
NB: fonctionne de manière fiable que pour Linq2Objects
Cela a fonctionné très bien. Merci. –
Veuillez ne pas répondre en liant simplement. Inclus le code pertinent dans la réponse. –
Ouais, je ne fais plus ça mais en 2010 je n'ai pas fait attention à cette pratique. – Stilgar