Для меня 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
list1 ++ list2
Так намного чище.