有时我觉得我需要在每个项目后插入一个新的项目,除了最后一个处理一个列表。类似你怎么可能把一个字符串列表的各项目之间的逗号。

我厌倦了编码的特殊情况下为每一个时间的最后(或第一)项的,所以捕获在一个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操作?

有帮助吗?

解决方案

的Haskell: intersperse

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

其他提示

它通常被称为加入。

这看起来有点像的string.join(),虽然加入不返回真正的列表。

它也用Clojure介调用。

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

听起来像做了一个拉链 - 上的长边和另一分离器(英国拉链),具有数据: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top