Na lista de manipulação funcional, o que chamamos de “inserir algo entre cada item”?
-
18-09-2019 - |
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 ?
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: -)