Иногда мне приходится обрабатывать список, вставляя новый элемент после каждого элемента, кроме последнего. Аналогично тому, как вы можете поставить запятую между каждым элементом списка строк.
Мне надоело каждый раз кодировать специальный случай для последнего (или первого) элемента, поэтому я захватил шаблон в расширении в стиле 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
со списками обычно вызывается в других функциональных средах или языки?