5

有时我发现我需要通过在每个项目之后插入一个新项目来处理一个列表,除了最后一个项目。类似于您在字符串列表的每个项目之间放置逗号的方式。

我厌倦了每次都为最后一个(或第一个)项目编写特殊情况,所以我在 Linq 样式的扩展中捕获了这种模式:

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;
    }
}

例如,这允许我以编程方式轻松地用超链接填充流文档,但每个链接之间都有一个换行符:

para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
                                  .Separate(() => new LineBreak()));

假设这在 System.Linq.Enumerable 中不存在(这是我通常在写完类似的东西后立即发现的),问题是,Separate在其他功能框架或语言中通常调用的列表上的这个操作是什么?

4

5 回答 5

14

哈斯克尔:intersperse

Zip通常表示不同的操作 ( zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

于 2009-07-21T11:24:03.190 回答
2

它通常被称为加入。

于 2009-07-21T11:23:57.590 回答
1

It is also called interpose in Clojure.

user> (interpose "," ["a" "b" "c"])
("a" "," "b" "," "c")
于 2009-07-26T19:18:17.810 回答
1

它看起来有点像 string.Join(),虽然 Join 不返回一个真正的列表。

于 2009-07-21T11:24:03.520 回答
0

听起来像是在做一个拉链(英国 - zip),数据在长边,分隔符在另一边:-)

于 2009-07-21T11:20:34.790 回答