Thỉnh thoảng tôi thấy tôi cần xử lý danh sách bằng cách chèn một mục mới sau mỗi mục, ngoại trừ mục cuối cùng. Tương tự như cách bạn có thể đặt dấu phẩy giữa mỗi mục trong danh sách chuỗi.Trong thao tác danh sách chức năng, chúng ta gọi là "chèn cái gì đó giữa mỗi mục"?
tôi đã chán ngấy mã hóa các trường hợp đặc biệt cho cuối cùng (hoặc đầu) mục mỗi lần, vì vậy tôi bắt các mô hình trong một phần mở rộng LINQ-style:
public static IEnumerable<T> Separate<T>(this IEnumerable<T> source,
Func<T> separator)
{
bool first = true;
foreach (T item in source)
{
if (first)
first = false;
else
yield return separator();
yield return item;
}
}
Ví dụ, điều này cho phép tôi dễ dàng programatically điền vào một tài liệu dòng chảy với các siêu liên kết, nhưng với một dòng-break giữa mỗi:
para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
.Separate(() => new LineBreak()));
Giả sử này chưa tồn tại trong System.Linq.Enumerable (đó là những gì tôi thường khám phá ngay sau khi viết một cái gì như thế này), câu hỏi là, đây là gìHoạt độngtrên danh sách thường được gọi trong các khung công tác hoặc ngôn ngữ chức năng khác?
Thú vị - đó là dự đoán của tôi cho một cái tên hay, nhưng tôi không biết nó đã được sử dụng trong Haskell :) –
Haskell và một con dấu Skeet phê duyệt, tại sao điều này thực tế là tiêu chuẩn vàng! –
Có, một trong những tên hàm tốt của Haskell (chỉ cần nghĩ đến mapM_ vv ;-)) – Dario