Concat
拡張メソッドとしての私にとって、連結する大きなシーケンスが複数ある場合、私のコードではあまりエレガントではありません。これは単なるインデント/フォーマットの問題であり、非常に個人的なものです。
確かに次のように見えます:
var list = list1.Concat(list2).Concat(list3);
次のように読めば、それほど読みにくいです:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
または次のような場合:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
またはあなたの好みのフォーマットは何でも。より複雑な連結で事態は悪化します。上記のスタイルで私の一種の認知的不一致の理由は、最初のシーケンスがConcat
メソッドの外側にあるのに対し、後続のシーケンスは内側にあるためです。Concat
拡張スタイルではなく、静的メソッドを直接呼び出す方が好きです。
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
より多くのシーケンスの連結について、OPと同じ静的メソッドを実行します。
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
だから私は書くことができます:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
よく見えます。私が書く必要がある余分な、そうでなければ冗長なクラス名は、私のシーケンスがConcat
呼び出しできれいに見えることを考えると私にとって問題ではありません。C#6ではそれほど問題ではありません。あなたはただ書くことができます:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
次のようなC#のリスト連結演算子が必要です。
list1 @ list2 // F#
list1 ++ list2 // Scala
その方がずっときれいです。