Convertir una lista a una cadena en C #

185

¿Cómo convierto una lista a una cadena en C #?

Cuando ejecuto toStringen un objeto List, obtengo:

System.Collections.Generic.List`1 [System.String]

Adaptador IA
fuente
1
Una lista es una colección, ¿cómo se supone que debe ser esta cadena?
Marko
Puede probar cualquiera de las tres formas mencionadas aquí .
RBT

Respuestas:

366

Tal vez estás tratando de hacer

string combindedString = string.Join( ",", myList.ToArray() );

Puede reemplazar "," por el que desea dividir los elementos en la lista.

Editar : como se menciona en los comentarios, también puedes hacer

string combindedString = string.Join( ",", myList);

Referencia:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.
Øyvind Bråthen
fuente
44
¿te refieres a string combindedString = string.Join (",", myList.ToArray ());
Sawe
2
Argumento '2': no ​​se puede convertir de 'System.Collections.Generic.List <string>' a 'string []'
Ash
9
Utilicé esto recientemente, funciona, solo omita el .ToArray ()
Adrian K
3
@AdrianK tiene razón porque .Net 4.0 agregó la capacidad de pasar cualquier IEnumerable <cadena>. Sin embargo, 4.0 se lanzó en abril de 2010, antes de que esta pregunta y respuesta fueran publicadas, por lo que tal vez la gente aquí todavía no lo sabía (aparte de algunas de las siguientes)
Andrew Steitz,
Para vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Voy a seguir mi instinto y asumir que quieres concatenar el resultado de llamar ToStringa cada elemento de la lista.

var result = string.Join(",", list.ToArray());
ChaosPandion
fuente
16

Podrías usar string.Join:

List<string> list = new List<string>()
{
    "Red",
    "Blue",
    "Green"
};

string output = string.Join(Environment.NewLine, list.ToArray());    
Console.Write(output);

El resultado sería:

Red    
Blue    
Green

Como alternativa Environment.NewLine, puede reemplazarlo con un separador de línea basado en cadenas de su elección.

Eandersson
fuente
14

Si desea algo un poco más complejo que una simple unión, puede usar LINQ, por ejemplo

var result = myList.Aggregate((total, part) => total + "(" + part.ToLower() + ")");

Tomará ["A", "B", "C"] y producirá "(a) (b) (c)"

James Gaunt
fuente
1
Use Aggregate con una semilla como primer parámetro para evitar lanzar InvalidOperationException para colecciones vacías.
Huacanacha
13

String.Join(" ", myList)o String.Join(" ", myList.ToArray()). El primer argumento es el separador entre las subcadenas.

var myList = new List<String> { "foo","bar","baz"};
Console.WriteLine(String.Join("-", myList)); // prints "foo-bar-baz"

Dependiendo de su versión de .NET, es posible que primero necesite usar ToArray () en la lista.

Markus Johnsson
fuente
9

Tienes un List<string>- así que si quieres concatenarlos, algo así como

string s = string.Join("", list);

funcionaría (en .NET 4.0 al menos). El primer parámetro es el delimitador. Entonces también podría delimitar comas, etc.

También es posible que desee ver el uso de StringBuilder para ejecutar concatenaciones, en lugar de formar una lista.

Marc Gravell
fuente
8

El .ToString()método para los tipos de referencia generalmente se resuelve a System.Object.ToString()menos que lo anule en un tipo derivado (posiblemente utilizando métodos de extensión para los tipos integrados). El comportamiento predeterminado para este método es mostrar el nombre del tipo en el que se llama. Entonces, lo que estás viendo es el comportamiento esperado.

Podrías intentar algo como string.Join(", ", myList.ToArray());lograr esto. Es un paso adicional, pero se podría poner en un método de extensión System.Collections.Generic.List<T>para hacerlo un poco más fácil. Algo como esto:

public static class GenericListExtensions
{
    public static string ToString<T>(this IList<T> list)
    {
        return string.Join(", ", list);
    }
}

(Tenga en cuenta que este es un código libre y no probado. No tengo un compilador a mano en este momento. Por lo tanto, querrá experimentar un poco con él).

David
fuente
funciona cuando lo llamo no ToString o lo ejecuto con un parámetro genérico. Pero me gusta tu idea de usar el método de extensión :)
IAdapter
4

Es difícil saberlo, pero quizás estés buscando algo como:

var myString = String.Join(String.Empty, myList.ToArray());

Esto llamará implícitamente al método ToString () en cada uno de los elementos de la lista y los concatenará.

Daniel Schaffer
fuente
1
String.Concat()logrará lo mismo mejor.
Jeff Mercado
2

Si usted está buscando para convertir los elementos de una lista en una cadena larga grande, hacer esto: String.Join("", myList). Algunas versiones anteriores del marco no le permiten pasar un IEnumerable como segundo parámetro, por lo que es posible que necesite convertir su lista en una matriz llamando a .ToArray ().

mattmc3
fuente
2

La respuesta directa a su pregunta es String.Joincomo otros han mencionado.

Sin embargo, si necesita algunas manipulaciones, puede usar Aggregate:

List<string> employees = new List<string>();
employees.Add("e1");
employees.Add("e2");
employees.Add("e3");

string employeesString = "'" + employees.Aggregate((x, y) => x + "','" + y) + "'";
Console.WriteLine(employeesString);
Console.ReadLine();
LCJ
fuente
1
en el código de producción, asegúrese de que su lista tenga algún elemento; de lo contrario, arrojará una excepción.
AZ_
1

Este método me ayudó cuando intenté recuperar datos del archivo de texto y almacenarlos en una matriz, luego asignarlos a una cadena disponible.

string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "\\Notes.txt");  
string marRes = string.Join(Environment.NewLine, lines.ToArray());

Ojalá pueda ayudar a alguien !!!!

PatsonLeaner
fuente
0

Esto parece funcionar para mí.

var combindedString = new string(list.ToArray());
mutuma
fuente
0

todas las respuestas anteriores NO funcionan para listas anidadas.

Andreas Otto
fuente