Dla mnie Concat
metoda rozszerzająca nie jest zbyt elegancka w moim kodzie, gdy mam wiele dużych sekwencji do połączenia. To tylko problem z wcięciami / formatowaniem kodu i coś bardzo osobistego.
Jasne, że wygląda dobrze tak:
var list = list1.Concat(list2).Concat(list3);
Nie tak czytelne, gdy brzmi:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
Lub gdy wygląda na to:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
lub cokolwiek preferujesz. Sytuacja pogarsza się przy bardziej złożonych konkatacjach. Przyczyną mojego rodzaju dysonansu poznawczego z powyższym stylem jest to, że pierwsza sekwencja znajduje się poza Concat
metodą, a kolejne sekwencje wewnątrz. Wolę bezpośrednio wywoływać Concat
metodę statyczną , a nie styl rozszerzenia:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Dla większej liczby konkatacji sekwencji stosuję tę samą metodę statyczną co w OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Mogę więc napisać:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Wygląda lepiej. Dodatkowa, w przeciwnym razie zbędna nazwa klasy, którą muszę napisać, nie stanowi dla mnie problemu, biorąc pod uwagę, że moje sekwencje wyglądają bardziej czysto po Concat
wywołaniu. To mniejszy problem w C # 6 . Możesz po prostu napisać:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
Szkoda, że nie mamy operatorów konkatenacji list w C #, coś takiego:
list1 @ list2
list1 ++ list2
W ten sposób dużo czystszy.