2010-08-26 17 views

Respuesta

617

Puede utilizar String.Join. Si usted tiene un List<string> entonces se puede llamar ToArray primera:

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

En .NET 4 no es necesario el ToArray más, ya que hay una sobrecarga de String.Join que toma un IEnumerable<string>.

44

También puede hacer esto con LINQ si desea

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

Aunque prefiero la sintaxis no LINQ en la respuesta de Quartermeister y creo que podría realizar Aggregate (probablemente más de las operaciones de concatenación) más lentas.

+6

Gracias por las respuestas rápidas, ambas funcionan bien. Tienes razón. Hice una pequeña medición de rendimiento usando la clase Cronómetro y el camino de línea es mucho más lento: String.Join (",", names.ToArray()); -> tomó 18 ticks Agregado ((a, b) => a + "," + b) -> tomó 736 ticks – nan

+1

Sí, creo que 'Aggregate' es mejor para las operaciones de tipo matemático. Con cadenas, esta operación es similar a 'para cada 'y solo se agrega a una cadena que es muy lenta en ineficaz porque está creando una nueva cadena para cada elemento que existe en la lista. – Bob

+0

Tenga en cuenta que Agregar sin valor de inicial arrojará una InvalidOperationException si el contenedor está vacío. Use la versión sembrada Aggregate (seed, func) para evitar el código de manejo de errores o las verificaciones condicionales. String.Join no tira en vacío así que no se requiere semilla o código adicional ... además no requiere Linq y la sintaxis es un poco más clara. – 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

¿Por qué está aquí? Apenas tiene algo que ver con el OP ...? – Assimilater

Cuestiones relacionadas