有时我发现我需要通过在每个项目之后插入一个新项目来处理一个列表,除了最后一个项目。类似于您在字符串列表的每个项目之间放置逗号的方式。
我厌倦了每次都为最后一个(或第一个)项目编写特殊情况,所以我在 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
在其他功能框架或语言中通常调用的列表上的这个操作是什么?