Para mim, Concat
como um método de extensão, não é muito elegante em meu código quando tenho várias sequências grandes para concat. Este é apenas um problema de recuo / formatação de código e algo muito pessoal.
Claro que fica bem assim:
var list = list1.Concat(list2).Concat(list3);
Não é tão legível quando se lê como:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
Ou quando parece:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
ou qualquer que seja sua formatação preferida. As coisas pioram com concats mais complexos. A razão para meu tipo de dissonância cognitiva com o estilo acima é que a primeira sequência está fora do Concat
método, enquanto as sequências subsequentes estão dentro. Prefiro chamar o Concat
método estático diretamente e não o estilo de extensão:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Para mais número de concats de sequências, carrego o mesmo método estático do OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Então posso escrever:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Parece melhor. O nome de classe extra, caso contrário redundante, que tenho que escrever não é um problema para mim, considerando que minhas sequências parecem mais claras com a Concat
chamada. É um problema menor em C # 6 . Você pode apenas escrever:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
Gostaríamos de ter operadores de concatenação de lista em C #, algo como:
list1 @ list2 // F#
list1 ++ list2 // Scala
Muito mais limpo assim.