5

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?

risposta

14

Haskell: intersperse

Zip di solito significa un'operazione diversa (zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

+1

Interessante - questa era la mia ipotesi anche per un bel nome, ma non sapevo che fosse già usato in Haskell :) –

+2

Haskell e un sigillo di approvazione Skeet, perché questo è praticamente il gold standard! –

+0

Sì, uno dei buoni nomi delle funzioni di Haskell (solo pensando a mapM_ ecc ;-)) – Dario

0

Suona come fare una cerniera (britannico - zip), con i dati sul lato lungo e il separatore d'altra :-)

+0

Zip è un'operazione diversa, tuttavia, che converte due sequenze in una nuova sequenza di tuple. –

2

E 'spesso chiamato registrazione.

+0

'Join' ha un significato simile su' String', ma ha già un significato molto diverso nel BCL su 'IEnumerable'. –

+0

+1 Anche il join sarà familiare agli utenti di Perl, è meno familiare agli utenti funzionali, un po 'sfortunato. Mi piace di più il nome intersezione, ma questa è un'idea meritoria – ShuggyCoUk

+0

Anche se di solito è un'operazione specifica per la stringa, c'è anche un String.join in Python, Ruby e probabilmente alcuni altri linguaggi, quindi non è assolutamente un brutto nome per questo tipo di operazione. – MatrixFrog

1

Sembra un po 'come string.join(), anche se registrazione non restituisce una vera e propria lista.

1

Si chiama anche interposizione in Clojure.

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