List: TRE Metodi di Merge rapidi ed immediati

List or not list? Questo non è il dilemma principale dell’articolo. In questo brevissimo HowTo desidero mostrare come si può effettuare in pochissime righe di codice l’unione di due List (nel nostro caso List) in tre modalità differenti. Nel caso abbiate più List sappiate che cambia di poco la sostanza. 

HowTo: AddRange, Concat e Linq

I tre metodi che ho scritto offrono lo stesso risultato finale, ma in modalità diverse.

AddRange:

*public void AddRange (System.Collections.Generic.IEnumerable collection);
*

Ad una lista viene aggiunta interamente la seconda in coda. Attenzione: Non vi è nessun ritorno in quanto è la lista stessa che viene modificata. NOn è un caso che nel codice di esempio venga esposta nella firma con ref. In questo modo voglio sia chiaro per tutti che la lista è lei a subire la modifica.

Concat: 

public static System.Collections.Generic.IEnumerable Concat (this System.Collections.Generic.IEnumerable first, System.Collections.Generic.IEnumerable second);

Date due liste, viene fornita in uscita una terza lista di tipo IEnumerable  contenente l’unione delle due fornite in ingresso

Linq:

Utilizzando Linq è possibile scorrere entrambe gli elementi delle due liste ed unirli in una terza tramite il Concat. Se la domanda è perchè utilizzare questa soluzione e non la precedente, la risposta è semplice. In caso di bisogno possiamo applicare dei filtri (.Where) su una o entrambe le liste per ottenere molto di più della semplice unione.

Quale usare? 

Non esiste una regola a mio avviso. Personalmente evito la sintassi Linq in questo caso se non ho necessità di applicare filtri. Delle due rimanenti allora quale uso? La risposta è contenuta in una nuova domanda: Mi serve mantenere le due liste coi valori originali? Oppure posso “sporcarne” una delle due inserendo all’interno l’altra? Merge With AddRange

1
2
3
4
5
6

   public void MergeWithAddRange(List<string> source, ref List<string> destination)
        {
            destination.AddRange(source);
        }

Merge With Concat

1
2
3
4
5
6

        public IEnumerable<string> MergeWithConcat(List<string> source,  List<string> destination)
        {
            return destination.Concat(source);
        }

Merge With Linq

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

        public IEnumerable<string> MergeWithLinq(List<string> firstList, List<string> secondList) {
            IEnumerable<string> result = firstList.
                Select(f => f)
                .Concat(
                    secondList.Select(s => s)
                );
            return result;
        }

List.AddRange(IEnumerable) Method * Enumerable.Concat(IEnumerable, IEnumerable) Method