5

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?

Trả lời

14

Haskell: intersperse

Zip thường có nghĩa là một hoạt động khác nhau (zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

+1

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 :) –

+2

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! –

+0

Có, một trong những tên hàm tốt của Haskell (chỉ cần nghĩ đến mapM_ vv ;-)) – Dario

0

Nghe có vẻ như đang tạo dây kéo (Anh - zip), có dữ liệu ở phía dài và dấu phân cách trên các mặt khác :-)

+0

Zip là một hoạt động khác, mặc dù chuyển đổi hai chuỗi thành một chuỗi các bộ dữ liệu mới. –

2

Nó thường được gọi là Tham gia.

+0

'Tham gia' có ý nghĩa tương tự trên' Chuỗi', nhưng đã có một ý nghĩa rất khác trong BCL trên 'IEnumerable'. –

+0

+1 Tham gia sẽ quen thuộc với người dùng perl quá, nó ít quen thuộc với người dùng chức năng, bit không may. Tôi thích tên giao nhau nhiều nhất nhưng đây là một ý tưởng xứng đáng – ShuggyCoUk

+0

Mặc dù nó thường là một hoạt động cụ thể theo chuỗi, cũng có một String.join bằng Python, Ruby và có thể là một vài ngôn ngữ khác, vì vậy đó chắc chắn không phải là tên xấu cho loại hoạt động này. – MatrixFrog

1

Nó trông hơi giống như string.Join(), mặc dù tham gia không trả lại một danh sách thật.

1

Nó cũng được gọi là interpose trong Clojure.

user> (interpose "," ["a" "b" "c"]) 
("a" "," "b" "," "c")