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 @ martedì 7 maggio 2013 20:12

Print

Comments on this entry:

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

Left by Nazareno at 08/05/2013 14:47
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.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011