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]


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.

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());

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.


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)"


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.


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.


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.)


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


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 ().


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();

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 !!!!


0

Cela semble fonctionner pour moi.

var combindedString = new string(list.ToArray());

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.