Spesso ho bisogno di unire due liste di oggetti (ad esempio ricavati da sorgenti dati diverse) eliminando i duplicati (definiti secondo una qualche logica), quindi non il più facile “union all”.
Mi ero stancato di riempire il programma di cicli for-each e select LINQ e ho cercato una soluzione “definitiva”.
L’ho trovata (come molte altre risposte) su StackOverflow.
Innanzitutto definiamo una classe “InlineComparer” generica che ci permetterà di confrontare i nostri oggetti.
public class InlineComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> getEquals;
private readonly Func<T, int> getHashCode;
public InlineComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
{
getEquals = equals;
getHashCode = hashCode;
}
public bool Equals(T x, T y)
{
return getEquals(x, y);
}
public int GetHashCode(T obj)
{
return getHashCode(obj);
}
}
Ora se ad esempio ho una classe “PalletDto” così definita…
public class PalletDto
{
public string PalletCode { get; set; }
public string LotCode { get; set; }
}
e voglio unire due liste (palletList1 e palletList2) eliminando i lotti della palletList2 dove il LotCode esiste già nella palletList1… dovrò “solo” scrivere:
var dupComparer = new InlineComparer<PalletDto>((l1, l2) => l1.LotCode == l2.LotCode, l => l.LotCode.GetHashCode());
var unionList = palletList1.Union(palletList2, dupComparer);
Happy coding <cit.>
Tag di Technorati:
LINQ,
Union