A mi Concat
como método de extensión, no es muy elegante en mi código cuando tengo varias secuencias grandes para concatizar. Esto es simplemente un problema de formato / sangría de codificación y algo muy personal.
Seguro que se ve bien así:
var list = list1.Concat(list2).Concat(list3);
No es tan legible cuando se lee como:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
O cuando parece:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
o cualquiera que sea su formato preferido. Las cosas empeoran con concats más complejos. La razón de mi tipo de disonancia cognitiva con el estilo anterior es que la primera secuencia se encuentra fuera del Concat
método, mientras que las secuencias posteriores se encuentran dentro. Prefiero llamar al Concat
método estático directamente y no al estilo de extensión:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Para más cantidad de concats de secuencias, llevo el mismo método estático que en OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Entonces puedo escribir:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Se ve mejor. El nombre de clase adicional, por lo demás redundante, que tengo que escribir no es un problema para mí, considerando que mis secuencias se ven más limpias con la Concat
llamada. Es un problema menor en C # 6 . Puedes simplemente escribir:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
Ojalá tuviéramos operadores de concatenación de listas en C #, algo como:
list1 @ list2 // F#
list1 ++ list2 // Scala
Mucho más limpio de esa manera.