在功能列表操作中,我们称之为"在每个项目之间插入内容"?

Dan*_*ker 5 c# language-agnostic functional-programming stream lazy-evaluation

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

我厌倦了每次编写最后一个(或第一个)项目的特殊情况,所以我在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
                                  .Separate(() => new LineBreak()));
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rio 14

哈斯克尔: intersperse

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

  • Haskell和Skeet认可的印章,为什么这实际上是金标准! (2认同)
  • 对于那些感兴趣的人,Zip在CLR 4 beta中:http://msdn.microsoft.com/en-us/library/dd267698(VS.100).aspx (2认同)