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: ,

posted @ Tuesday, May 7, 2013 5:12 PM

Print

Comments on this entry:

# re: LINQ e union di due liste di oggetti custom

Left by Nazareno at 5/8/2013 11:47 AM
Gravatar
Ciao, unirli prima e usare il distinct è uguale a unirli con la definizione del comparer al primo giro e non necessita dell'implementazione dell'interfaccia IEquatable (comodo se lavori su DTO tornati dai servizi).
La tua soluzione è, comunque, altrettanto valida e l'utilizzo di una o dell'altra dipende, come al solito, dal contesto dell'applicazione (ad esempio se hai già implementato l'interfaccia IEquatable per altri motivi).
Comments have been closed on this topic.
«January»
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678