Per me Concat
come metodo di estensione non è molto elegante nel mio codice quando ho più sequenze di grandi dimensioni da concatenare. Questo è semplicemente un problema di indentazione / formattazione del codice e qualcosa di molto personale.
Certo che sembra buono così:
var list = list1.Concat(list2).Concat(list3);
Non così leggibile quando si legge come:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
O quando sembra:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
o qualunque sia la tua formattazione preferita. Le cose peggiorano con concatenazioni più complesse. La ragione della mia sorta di dissonanza cognitiva con lo stile di cui sopra è che la prima sequenza si trova al di fuori del Concat
metodo mentre le sequenze successive si trovano all'interno. Preferisco chiamare Concat
direttamente il metodo statico e non lo stile di estensione:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Per più numero di concatenazioni di sequenze porto lo stesso metodo statico di OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Quindi posso scrivere:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Sembra migliore. Il nome della classe extra, altrimenti ridondante, che devo scrivere non è un problema per me, considerando che le mie sequenze sembrano più pulite con la Concat
chiamata. È meno un problema in C # 6 . Puoi semplicemente scrivere:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
Avremmo voluto avere gli operatori di concatenazione degli elenchi in C #, qualcosa come:
list1 @ list2 // F#
list1 ++ list2 // Scala
Molto più pulito in questo modo.