对我来说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
直接调用static 方法,而不是扩展样式:
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
这样更干净。