Pour moi Concat
, une méthode d'extension n'est pas très élégante dans mon code lorsque j'ai plusieurs grandes séquences à concaténer. C'est simplement un problème d'indentation / formatage de code et quelque chose de très personnel.
Bien sûr, cela ressemble à ceci:
var list = list1.Concat(list2).Concat(list3);
Pas si lisible quand il se lit comme:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
Ou quand ça ressemble à:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
ou quel que soit votre formatage préféré. Les choses empirent avec des concats plus complexes. La raison de ma sorte de dissonance cognitive avec le style ci-dessus est que la première séquence se trouve en dehors de la Concat
méthode alors que les séquences suivantes se trouvent à l'intérieur. Je préfère plutôt appeler la Concat
méthode statique directement et non le style d'extension:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Pour plus de nombre de concats de séquences, je porte la même méthode statique que dans OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Donc je peux écrire:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Regarde mieux. Le nom de classe supplémentaire, sinon redondant, que je dois écrire n'est pas un problème pour moi étant donné que mes séquences semblent plus propres avec l' Concat
appel. C'est moins un problème en C # 6 . Vous pouvez simplement écrire:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
J'aurais aimé avoir des opérateurs de concaténation de liste en C #, quelque chose comme:
list1 @ list2 // F#
list1 ++ list2 // Scala
Beaucoup plus propre de cette façon.