Для мене Concat
як метод розширення не дуже елегантний у моєму коді, коли у мене є кілька великих послідовностей для 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
Так набагато чистіше.