C # List <string> para encadenar con delimitador

631

¿Hay una función en C # para convertir rápidamente alguna colección a cadena y separar valores con delimitador?

Por ejemplo:

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

yaya
fuente

Respuestas:

1201

Puedes usar String.Join. Si tiene un List<string>teléfono, puede llamar ToArrayprimero:

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

En .NET 4 ya no necesita ToArraymás, ya que hay una sobrecarga de String.Joineso toma un IEnumerable<string>.

Resultados:


John, Anna, Monica

Quartermeister
fuente
95

También puedes hacer esto con linq si quieres

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 Aggregatepodría funcionar más lentamente (probablemente más operaciones de concatenación de cadenas).

Beto
fuente
19
Gracias por las respuestas rápidas, ambos funcionan bien. Tienes razón, hice una pequeña medición de rendimiento usando la clase Stopwatch y el linq-way es mucho más lento: String.Join (",", names.ToArray ()); -> tomó 18 ticks Agregado ((a, b) => a + "," + b) -> tomó 736 ticks
nan
2
Sí, creo que Aggregatees mejor para las operaciones de tipo matemático. Con las cadenas, esta operación es similar a for eaching y solo se agrega a una cadena que es muy lenta e ineficiente porque está creando una nueva cadena para cada elemento que existe en la lista.
Bob
Tenga en cuenta que Aggregate sin un valor de inicialización generará una InvalidOperationException si el contenedor está vacío. Utilice la versión sembrada Agregado (semilla, func) para evitar el código de manejo de errores o las verificaciones condicionales. String.Join no tira en vacío, por lo que no se requiere semilla ni código adicional ... además no requiere Linq y la sintaxis es un poco más clara.
Huacanacha
1
El agregado en el ejemplo anterior puede funcionar más rápido si usa StringBuilder. No se recomienda usar '+' para realizar la concatenación múltiple. Vea la sección de Comentarios aquí ( msdn.microsoft.com/en-us/library/… )
Ilya Denisov