LINQ e union di due liste di oggetti custom

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”. Occhiolino

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. Occhiolino

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: ,
«maggio»
domlunmarmergiovensab
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678