Konvertieren Sie eine Liste in eine Zeichenfolge in C #

184

Wie konvertiere ich eine Liste in eine Zeichenfolge in C #?

Wenn ich toStringein List-Objekt ausführe , erhalte ich:

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

IAdapter
quelle
1
Eine Liste ist eine Sammlung. Wie soll diese Zeichenfolge aussehen?
Marko
Sie können eine der drei hier genannten Möglichkeiten ausprobieren .
RBT

Antworten:

363

Vielleicht versuchst du es zu tun

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

Sie können "," durch das ersetzen, durch das Sie die Elemente in der Liste teilen möchten.

Bearbeiten : Wie in den Kommentaren erwähnt, könnten Sie auch tun

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

Referenz:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.
Øyvind Bråthen
quelle
4
meinst du string combindedString = string.Join (",", myList.ToArray ());
Sawe
2
Argument '2': Konvertiert nicht von 'System.Collections.Generic.List <string>' in 'string []'
Ash
9
Ich habe dies kürzlich verwendet, es funktioniert - lassen Sie einfach die .ToArray ()
Adrian K
3
@AdrianK Sie haben Recht, weil das .NET 4.0 die Möglichkeit hinzugefügt hat, einen beliebigen IEnumerable <string> zu übergeben. 4.0 wurde jedoch im April 2010 veröffentlicht, bevor diese Frage und Antwort veröffentlicht wurden, sodass die Leute hier vielleicht noch nichts davon wussten (außer ein paar unten)
Andrew Steitz
Für vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Ich werde mit meinem Bauchgefühl gehen und davon ausgehen, dass Sie das Ergebnis des Aufrufs ToStringjedes Elements der Liste verketten möchten .

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

Sie könnten verwenden string.Join:

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

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

Das Ergebnis wäre:

Red    
Blue    
Green

Alternativ Environment.NewLinekönnen Sie es durch ein auf Zeichenfolgen basierendes Zeilentrennzeichen Ihrer Wahl ersetzen.

eandersson
quelle
14

Wenn Sie etwas etwas komplexeres als eine einfache Verknüpfung wünschen, können Sie LINQ verwenden, z

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

Nimmt ["A", "B", "C"] und erzeugt "(a) (b) (c)"

James Gaunt
quelle
1
Verwenden Sie Aggregat mit einem Startwert als ersten Parameter, um zu vermeiden, dass InvalidOperationException für leere Sammlungen ausgelöst wird.
Huacanacha
13

String.Join(" ", myList)oder String.Join(" ", myList.ToArray()). Das erste Argument ist das Trennzeichen zwischen den Teilzeichenfolgen.

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

Abhängig von Ihrer .NET-Version müssen Sie möglicherweise zuerst ToArray () in der Liste verwenden.

Markus Johnsson
quelle
9

Sie haben eine List<string>- wenn Sie wollen, dass sie verkettet werden, so etwas wie

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

würde funktionieren (zumindest in .NET 4.0). Der erste Parameter ist das Trennzeichen. Sie können also auch durch Kommas trennen usw.

Möglicherweise möchten Sie auch StringBuilder verwenden, um Verkettungen auszuführen, anstatt eine Liste zu erstellen.

Marc Gravell
quelle
8

Die .ToString()Methode für Referenztypen wird normalerweise wieder aufgelöst, es System.Object.ToString()sei denn, Sie überschreiben sie in einem abgeleiteten Typ (möglicherweise mithilfe von Erweiterungsmethoden für die integrierten Typen). Das Standardverhalten für diese Methode besteht darin, den Namen des Typs auszugeben, für den sie aufgerufen wird. Was Sie also sehen, ist erwartetes Verhalten.

Sie könnten so etwas versuchen string.Join(", ", myList.ToArray());, um dies zu erreichen. Es ist ein zusätzlicher Schritt, aber es könnte in eine Erweiterungsmethode integriert werden System.Collections.Generic.List<T>, um es ein bisschen einfacher zu machen. Etwas wie das:

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

(Beachten Sie, dass dies Freihand- und ungetesteter Code ist. Ich habe derzeit keinen Compiler zur Hand. Sie sollten also ein wenig damit experimentieren.)

David
quelle
Es funktioniert, wenn ich es nicht ToString nenne oder es mit generischen Parametern ausführe. Aber ich mag Ihre Idee, Erweiterungsmethode zu verwenden :)
IAdapter
4

Es ist schwer zu sagen, aber vielleicht suchen Sie nach etwas wie:

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

Dadurch wird implizit die ToString () -Methode für jedes Element in der Liste aufgerufen und verkettet.

Daniel Schaffer
quelle
1
String.Concat()wird das gleiche besser erreichen.
Jeff Mercado
2

Wenn Sie die Elemente in einer Liste in eine große lange Zeichenfolge verwandeln möchten, gehen Sie wie folgt vor : String.Join("", myList). In einigen älteren Versionen des Frameworks können Sie keine IEnumerable als zweiten Parameter übergeben. Daher müssen Sie Ihre Liste möglicherweise durch Aufrufen von .ToArray () in ein Array konvertieren.

mattmc3
quelle
2

Die direkte Antwort auf Ihre Frage ist, String.Joinwie andere erwähnt haben.

Wenn Sie jedoch einige Manipulationen benötigen, können Sie Folgendes verwenden 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
quelle
1
Stellen Sie im Produktionscode sicher, dass Ihre Liste ein Element enthält, da sonst eine Ausnahme ausgelöst wird.
AZ_
1

Diese Methode hat mir beim Versuch geholfen, Daten aus der Textdatei abzurufen und im Array zu speichern. Weisen Sie sie dann einer verfügbaren Zeichenfolge zu.

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

Hoffentlich kann jemand helfen !!!!

PatsonLeaner
quelle
0

Das scheint bei mir zu funktionieren.

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

Alle obigen Antworten funktionieren NICHT für verschachtelte Listen.

Andreas Otto
quelle