Pergunta

Às vezes eu acho que eu preciso para processar uma lista através da inserção de um novo item depois de cada item, exceto a última. Semelhante à forma como você pode colocar uma vírgula entre cada item de uma lista de strings.

Eu cansei de codificar o caso especial para o último (ou primeiro) item de cada vez, de modo que eu capturei o padrão em uma extensão Linq-style:

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;
    }
}

Por exemplo, isso me permite facilmente programaticamente preencher um documento de fluxo com hyperlinks, mas com uma quebra de linha entre cada um:

para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
                                  .Separate(() => new LineBreak()));

Assumindo que este ainda não existir no System.Linq.Enumerable (que é o que eu normalmente descobrir imediatamente depois de escrever algo assim), a questão é, o que é esta operação Separate nas listas de chamadas geralmente em outras estruturas funcionais ou línguas ?

Foi útil?

Solução

Haskell: intersperse

Zip geralmente significa uma operação diferente (zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

Outras dicas

É muitas vezes chamado Join.

Parece um pouco como String.Join (), embora Junte não retorna uma lista real.

É também chamado de interpor em Clojure.

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

Sounds como fazer-se um zíper (British - zip), com dados sobre o lado longo e o separador por outro: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top