Direi che String.Join richiede la capacità di scorrere la matrice due volte (una volta per misurare la lunghezza, e una volta a fare la copia). Alcune classi che implementano iEnumerable possono essere unite con successo in un array di stringhe eseguendo un passaggio per contare la lunghezza, chiamando Reset sull'enumeratore e usando un secondo passaggio per copiare i dati, ma poiché iEnumerable non supporta né una proprietà Capabilities, né una famiglia di classi derivate come iMultiPassEnumerable, l'unico modo in cui String.Join può accettare in modo sicuro un IEnumerable potrebbe essere (1) enumerare un qualche tipo di elenco ed eseguire il join su quello, (2) indovinare la dimensione della stringa di destinazione e riallocare come necessario, o (3) combinare gli approcci, raggruppando stringhe corte in gruppi di fino ad es 8K, e quindi combinando tutti i cluster in un risultato finale (che sarebbe una miscela di cluster pre-concatenati e stringhe lunghe dalla matrice originale).
Mentre concederei sicuramente che sarebbe comodo per String.Join includere un overhead che converte un iEnumerable in un elenco, non vedo che fornirebbe più efficienza rispetto a fare tale conversione manualmente (a differenza del versione di array di String.Join, che è più efficiente di unire manualmente le stringhe singolarmente).
Sarete felici di sapere che accetta "IEnumerable" in.NET 4 –
La mia ipotesi sarebbe che è stato aggiunto prima dell'esistenza di IEnumerable. – asawyer
string.Join era qui molto prima di Linq. Come ti infastidisce? Sono solo pochi altri personaggi da scrivere. –