В манипулировании функциональным списком, что мы называем «вставкой чего-либо между каждым элементом»? - PullRequest
5 голосов
/ 21 июля 2009

Иногда мне приходится обрабатывать список, вставляя новый элемент после каждого элемента, кроме последнего. Аналогично тому, как вы можете поставить запятую между каждым элементом списка строк.

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

Ответы [ 5 ]

14 голосов
/ 21 июля 2009

Haskell: intersperse

Zip обычно означает другую операцию (zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

2 голосов
/ 21 июля 2009

Его часто называют Join.

1 голос
/ 26 июля 2009

Это также называется вставкой в ​​Clojure.

user> (interpose "," ["a" "b" "c"])
("a" "," "b" "," "c")
1 голос
/ 21 июля 2009

Это выглядит как string.Join (), хотя Join не возвращает реальный список.

0 голосов
/ 21 июля 2009

Похоже на выполнение молнии (британский - почтовый индекс) с данными на длинной стороне и разделителем на другой: -)

...