나에게 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
그렇게하면 훨씬 더 깨끗해집니다.