Иногда я нахожу, что мне нужно обработать список, вставив новый элемент после каждого элемента, кроме последнего. Подобно тому, как вы можете поместить запятую между каждым элементом списка строк.В функциональном манипулировании списком, что мы называем «вставляем что-то между каждым элементом»?
я пресытился кодирование особого случая за последний (или первый) пункт каждый раз, так что я захватил шаблон в расширении в 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 :) –
Haskell и печать одобрения Skeet, почему это практически золотой стандарт! –
Да, одно из полезных имен функций Haskell (просто думая о mapM_ и т. Д .;)) – Dario