2010-08-26 12 views
325

Esiste una funzione in C# per convertire rapidamente alcune raccolte in stringhe e separare i valori con delimitatore?C# Lista <string> a stringa con delimitatore

Ad esempio:

List<string> names ->string names_together = "John, Anna, Monica"

risposta

617

È possibile utilizzare String.Join. Se si dispone di un List<string> quindi è possibile chiamare ToArray prima:

List<string> names = new List<string>() { "John", "Anna", "Monica" }; 
var result = String.Join(", ", names.ToArray()); 

In .NET 4 non occorre il ToArray più, poiché non v'è un sovraccarico di String.Join che accetta un IEnumerable<string>.

44

Si può anche fare questo con LINQ se vuoi

var names = new List<string>() { "John", "Anna", "Monica" }; 
var joinedNames = names.Aggregate((a, b) => a + ", " + b); 

Anche se io preferisco la sintassi non LINQ in risposta di Quartermeister e penso Aggregate potrebbe eseguire più lenti (probabilmente più operazioni di concatenazione di stringhe).

+6

Grazie per le risposte rapide, entrambi funzionano bene. Hai ragione, ho eseguito una piccola misurazione delle prestazioni utilizzando la classe Stopwatch e il modo linq è molto più lento: String.Join (",", names.ToArray()); -> ha preso 18 ticks Aggregate ((a, b) => a + "," + b) -> ha preso 736 ticks – nan

+1

Sì, penso che "Aggregate" sia migliore per le operazioni di tipo Math. Con le stringhe questa operazione è simile a 'per ciascuna e basta accodare a una stringa che è molto lenta in inefficienza perché stai creando una nuova stringa per ogni elemento che esiste nell'elenco. – Bob

+0

Si noti che Aggregate senza un valore di inizializzazione genererà un'eccezione InvalidOperationException se il contenitore è vuoto. Utilizzare la versione con seeding Aggregate (seed, func) per evitare il codice di gestione degli errori oi controlli condizionali. String.Join non gira su vuoto, quindi non è richiesto alcun seme o codice aggiuntivo ... in più non richiede Linq e la sintassi è un po 'più chiara. – Huacanacha

-2
List<string> targets = new List<string>(); 

var InboxChecked = true; 
var BannerChecked = false; 
var EmailChecked = true; 

if (InboxChecked) 
{ 
    targets.Add("Inbox"); 
} 

if (BannerChecked) 
{ 
    targets.Add("Banner"); 
} 

if (EmailChecked) 
{ 
    targets.Add("Email"); 
} 

var index = 0; 

if (targets.Any()) 
{ 
    var aggregate = targets.Aggregate((s1, s2) => 
    { 
     return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2; 
    }); 

    // aggregate.Dump(); 
} 

// returns -> Inbox and Email 
+8

Perché è qui? Ha a malapena qualcosa a che fare con l'OP ...? – Assimilater

Problemi correlati