Occasionalmente trovo necessario elaborare un elenco inserendo un nuovo elemento dopo ogni elemento, tranne l'ultimo. Simile a come potresti inserire una virgola tra ogni elemento di un elenco di stringhe.Nella manipolazione degli elenchi funzionali, come chiamiamo "inserire qualcosa tra ogni elemento"?
Mi sono stufato di codificare il caso speciale per l'ultimo (o il primo) elemento ogni volta, così ho catturato il modello in un interno in stile 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;
}
}
Per esempio, questo mi permette di facilmente programatically compilare un documento di flusso con collegamenti ipertestuali, ma con una linea-break tra ciascuno di essi:
para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
.Separate(() => new LineBreak()));
Assumendo questo non esiste già in System.Linq.Enumerable (che è quello che di solito scopro subito dopo aver scritto qualcosa come questo), la domanda è, che cos'è questoOperazionesu liste solitamente chiamate in altri framework o linguaggi funzionali?
Interessante - questa era la mia ipotesi anche per un bel nome, ma non sapevo che fosse già usato in Haskell :) –
Haskell e un sigillo di approvazione Skeet, perché questo è praticamente il gold standard! –
Sì, uno dei buoni nomi delle funzioni di Haskell (solo pensando a mapM_ ecc ;-)) – Dario