Đối với tôi Concat
như một phương thức mở rộng không phải là rất thanh lịch trong mã của tôi khi tôi có nhiều chuỗi lớn để nối. Đây chỉ đơn thuần là vấn đề thụt lề / định dạng codde và một cái gì đó rất cá nhân.
Chắc chắn nó sẽ tốt như thế này:
var list = list1.Concat(list2).Concat(list3);
Không thể đọc được khi nó đọc như:
var list = list1.Select(x = > x)
.Concat(list2.Where(x => true)
.Concat(list3.OrderBy(x => x));
Hoặc khi nó trông giống như:
return Normalize(list1, a, b)
.Concat(Normalize(list2, b, c))
.Concat(Normalize(list3, c, d));
hoặc bất kỳ định dạng ưa thích của bạn là gì. Mọi thứ trở nên tồi tệ hơn với những kết nối phức tạp hơn. Lý do cho tôi loại bất hòa nhận thức với phong cách trên là người đầu tiên bên ngoài chuỗi lời nói dối của Concat
phương pháp trong khi trình tự tiếp theo nằm bên trong. Tôi thích gọi Concat
phương thức tĩnh trực tiếp chứ không phải kiểu mở rộng:
var list = Enumerable.Concat(list1.Select(x => x),
list2.Where(x => true));
Để có thêm số lượng kết hợp của chuỗi, tôi thực hiện cùng một phương thức tĩnh như trong OP:
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sequences)
{
return sequences.SelectMany(x => x);
}
Vì vậy, tôi có thể viết:
return EnumerableEx.Concat
(
list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x)
);
Trông tốt hơn. Việc bổ sung, nếu không thì thừa, tên lớp mà tôi phải viết không phải là vấn đề đối với tôi vì các trình tự của tôi trông gọn gàng hơn với lệnh Concat
gọi. Nó ít có vấn đề hơn trong C # 6 . Bạn chỉ có thể viết:
return Concat(list1.Select(x = > x),
list2.Where(x => true),
list3.OrderBy(x => x));
Chúng tôi muốn chúng tôi có danh sách các toán tử nối trong C #, giống như:
list1 @ list2 // F#
list1 ++ list2 // Scala
Theo cách đó sạch hơn nhiều.