Mamy klasę:
public class Value { public int IntValue { get; set; } public string StringValue { get; set; } public override string ToString() { return IntValue + "_" + StringValue; } }
Tworzymy comperer (klasa porównująca dwa obiekty), w którym podajemy funkcję zwracającą informację po jakim będziemy porównywać obiekty. Ta funkcja będzie nam potrzebne do tworzenia hash kodu.
public class KeyEqualityComparer<T> : IEqualityComparer<T> { public Func<T, object> _keyToCompar { get; private set; } public KeyEqualityComparer(Func<T, object> keyToCompar) { _keyToCompar = keyToCompar; } public bool Equals(T x, T y) { return _keyToCompar(x).Equals(_keyToCompar(y)); } public int GetHashCode(T obj) { return _keyToCompar(obj).GetHashCode(); } }
Aby przedstawić KeyEqualityComparer wystarczy wywołać następujący kod:
var list = new List<Value> { new Value {IntValue = 1, StringValue = "One "}, new Value {IntValue = 1, StringValue = "Two"} }; var distinctList1 = list.Distinct(new KeyEqualityComparer<Value>(x =>x.IntValue));
Dodatkowo możemy stworzyć extension method:
public static IEqualityComparer<T> ToEqualityComparer<T>(this Func<T, object> func) { KeyEqualityComparer<T> equalityComparer = new KeyEqualityComparer<T>(func); return equalityComparer; }
I wtedy możemy operować za pomocą wyrażeniu lambda:
Func<Value, object> keyToCompare = x => x.IntValue; var distinctList = list.Distinct(keyToCompare.ToEqualityComparer());
Brak komentarzy:
Prześlij komentarz