Convertir une liste en chaîne en C #

185

Comment convertir une liste en chaîne en C #?

Lorsque j'exécute toStringsur un objet List, j'obtiens:

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

IAdapter
la source
1
Une liste est une collection, à quoi cette chaîne est-elle censée ressembler?
Marko le
Vous pouvez essayer l'une des trois méthodes mentionnées ici .
RBT

Réponses:

366

Peut-être que vous essayez de faire

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

Vous pouvez remplacer "," par ce que vous voulez diviser les éléments de la liste.

Edit : Comme mentionné dans les commentaires, vous pouvez également le faire

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

Référence:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.
Øyvind Bråthen
la source
4
voulez-vous dire string combindedString = string.Join (",", myList.ToArray ());
sawe
2
Argument '2': impossible de convertir de 'System.Collections.Generic.List <string>' en 'string []'
Ash
9
Je l'ai utilisé récemment, cela fonctionne - omettez simplement le .ToArray ()
Adrian K
3
@AdrianK vous avez raison car le .Net 4.0 a ajouté la possibilité de transmettre n'importe quelle <string> IEnumerable. Cependant, la version 4.0 a été publiée en avril 2010, avant que cette question et cette réponse ne soient publiées, donc peut-être que les gens ici n'en étaient tout simplement pas encore au courant (à part quelques-uns ci-dessous)
Andrew Steitz
Pour vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Je vais suivre mon instinct et supposer que vous voulez concaténer le résultat de l'appel ToStringà chaque élément de la liste.

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

Vous pouvez utiliser string.Join:

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

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

Le résultat serait:

Red    
Blue    
Green

Au lieu de cela Environment.NewLine, vous pouvez le remplacer par un séparateur de ligne basé sur une chaîne de votre choix.

eandersson
la source
14

Si vous voulez quelque chose d'un peu plus complexe qu'une simple jointure, vous pouvez utiliser LINQ par exemple

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

Prendra ["A", "B", "C"] et produira "(a) (b) (c)"

James Gaunt
la source
1
Utilisez Aggregate avec une valeur de départ comme premier paramètre pour éviter de lancer une exception InvalidOperationException pour les collections vides.
Huacanacha
13

String.Join(" ", myList)ou String.Join(" ", myList.ToArray()). Le premier argument est le séparateur entre les sous-chaînes.

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

Selon votre version de .NET, vous devrez peut-être d'abord utiliser ToArray () dans la liste.

Markus Johnsson
la source
9

Vous avez un List<string>- donc si vous voulez qu'ils soient concaténés, quelque chose comme

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

fonctionnerait (au moins dans .NET 4.0). Le premier paramètre est le délimiteur. Ainsi, vous pouvez également délimiter par des virgules, etc.

Vous pouvez également envisager d'utiliser StringBuilder pour exécuter des concaténations, plutôt que de former une liste.

Marc Gravell
la source
8

La .ToString()méthode des types référence est généralement résolue à System.Object.ToString()moins que vous ne la remplaciez dans un type dérivé (éventuellement en utilisant des méthodes d'extension pour les types intégrés). Le comportement par défaut de cette méthode consiste à afficher le nom du type sur lequel elle est appelée. Donc, ce que vous voyez est un comportement attendu.

Vous pouvez essayer quelque chose comme string.Join(", ", myList.ToArray());pour y parvenir. C'est une étape supplémentaire, mais cela pourrait être mis dans une méthode d'extension pour le System.Collections.Generic.List<T>rendre un peu plus facile. Quelque chose comme ça:

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

(Notez qu'il s'agit de code libre et non testé. Je n'ai pas de compilateur à portée de main pour le moment. Vous voudrez donc l'expérimenter un peu.)

David
la source
cela fonctionne quand je ne l'appelle pas ToString ou que je l'exécute avec un paramètre générique. Mais j'aime votre idée d'utiliser la méthode d'extension :)
IAdapter
4

C'est difficile à dire, mais vous cherchez peut-être quelque chose comme:

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

Cela appellera implicitement la méthode ToString () sur chacun des éléments de la liste et les concaténera.

Daniel Schaffer
la source
1
String.Concat()réalisera mieux la même chose.
Jeff Mercado
2

Si vous cherchez à faire tourner les éléments d'une liste dans une grande chaîne longue, faites ceci: String.Join("", myList). Certaines anciennes versions de l'infrastructure ne vous permettent pas de passer un IEnumerable comme deuxième paramètre, vous devrez donc peut-être convertir votre liste en tableau en appelant .ToArray ().

mattmc3
la source
2

La réponse directe à votre question est String.Joincomme d'autres l'ont mentionné.

Cependant, si vous avez besoin de quelques manipulations, vous pouvez utiliser 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
la source
1
dans le code de production, assurez-vous que votre liste contient un élément, sinon elle lèvera une exception.
AZ_
1

Cette méthode m'a aidé en essayant de récupérer des données à partir d'un fichier texte et de les stocker dans Array, puis de les affecter à une chaîne variable.

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

J'espère que cela peut aider quelqu'un !!!!

PatsonLeaner
la source
0

Cela semble fonctionner pour moi.

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

toutes les réponses ci-dessus ne fonctionnent PAS pour les listes imbriquées.

Andreas Otto
la source