Wie erstelle ich eine durch Kommas getrennte Zeichenfolge aus einer ArrayList?

82

Ich speichere eine ArrayList of Ids in einem Verarbeitungsskript, das ich als durch Kommas getrennte Liste für die Ausgabe in das Debug-Protokoll ausspucken möchte. Gibt es eine Möglichkeit, dies einfach zu erreichen, ohne die Dinge zu durchlaufen?

EDIT: Vielen Dank an Joel für den Hinweis auf die Liste (Of T), die in .net 2.0 und höher verfügbar ist. Das macht die Sache TONNEN einfacher, wenn Sie es zur Verfügung haben.

Dillie-O
quelle
Ich nehme an, weil Sie eine ArrayList verwenden, verwenden Sie .Net 1.0 oder .Net 1.1?
kͩeͣmͮpͥ 17

Antworten:

156

Ja, ich beantworte meine eigene Frage, aber ich habe sie hier noch nicht gefunden und dachte, das sei eine ziemlich raffinierte Sache:

... in VB.NET:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String()))

... in C #

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String")))

Das einzige "Problem" dabei ist, dass in der ArrayList die Elemente als Strings gespeichert sein müssen, wenn Sie Option Strict verwenden, um sicherzustellen, dass die Konvertierung ordnungsgemäß erfolgt.

BEARBEITEN: Wenn Sie .net 2.0 oder höher verwenden, erstellen Sie einfach ein Objekt vom Typ List (Of String), und Sie erhalten das, was Sie benötigen. Vielen Dank an Joel, der das angesprochen hat!

String.Join(",", TargetList.ToArray())
Dillie-O
quelle
2
Es gibt andere "Fallstricke". Eine davon ist, dass diese Lösung nicht so idiomatisch ist wie das Durchlaufen der Liste selbst. Zweitens dauert es doppelt so lange wie eine einfache foreach-Schleife, wenn ToArray die Sammlung durchläuft und Join ebenfalls.
Bill the Lizard
Natürlich gibt es immer die Möglichkeit, System.Collections.Specialized.StringCollection zu verwenden.
ICR
Wenn Sie stattdessen eine List <string> verwenden können, verfügt diese über eine integrierte ToArray () -Methode und beseitigt Typprobleme. BTW - typeof (string) ist Type.GetType ("System.String") vorzuziehen.
Jon B
17

Die bisherigen Lösungen sind alle recht kompliziert. Die idiomatische Lösung sollte zweifellos sein:

String.Join(",", x.Cast(Of String)().ToArray())

In neuen Framework-Versionen ist keine ausgefallene Akrobatik erforderlich. Unter der Annahme einer nicht so modernen Version wäre Folgendes am einfachsten:

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String())))

Die zweite Lösung von mspmsp ist ebenfalls ein guter Ansatz, funktioniert jedoch nicht, da das AddressOfSchlüsselwort fehlt . Auch Convert.ToStringist eher ineffizient (viele unnötige interne Bewertungen) und die ConvertKlasse ist im Allgemeinen nicht sehr sauber gestaltet. Ich neige dazu, es zu vermeiden, zumal es völlig überflüssig ist.

Konrad Rudolph
quelle
Sind CType und CStr nicht im Wesentlichen Aufrufe der Convert-Klasse?
Joel Coehoorn
@Echostorm: Wo sage ich das? @ Joel: überhaupt nicht. Meistens rufen sie die MS.VB.CS.Conversions.ToStringHilfsfunktion auf, was zu einem einfachen ToStringAufruf führt. Aber selbst diese Methode würde ich nicht direkt y nennen (im Gegensatz zu den VB-Cast-Operatoren).
Konrad Rudolph
16

Etwas wie:

String.Join(",", myArrayList.toArray(string.GetType()) );

Was im Grunde Schleifen weißt du ...

BEARBEITEN

wie wäre es mit:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));
mspmsp
quelle
oops ... das ist nicht richtig ... wie wäre es mit: string.Join (",", Array.ConvertAll <Objekt, Zeichenfolge> (a.ToArray (), Convert.ToString));
mspmsp
8

string.Join(" ,", myArrayList.ToArray()); Dies funktioniert mit .net Framework 4.5

Bashburak
quelle
2

Hier ist ein einfaches Beispiel, das die Erstellung einer durch Kommas getrennten Zeichenfolge mit String.Join () aus einer Liste von Zeichenfolgen demonstriert:

List<string> histList = new List<string>();
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff"));
histList.Add(Index.ToString());
/*arValue is array of Singles */
foreach (Single s in arValue)
{
     histList.Add(s.ToString());
}
String HistLine = String.Join(",", histList.ToArray());
Jim Lahman
quelle
1
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

oder

string.Concat(foo.ToArray().Select(a => a += ",").ToArray())

Aktualisieren, da dies extrem alt ist. Sie sollten natürlich string.Join jetzt verwenden. Es gab es zum Zeitpunkt des Schreibens nicht als Option.

Echostorm
quelle
Wow, es tut mir wirklich leid! Ich habe das "C #" - Tag in der Frage völlig übersehen und vermutet, dass Ihre Antworten als gültiger VB-Code gedacht sind. Schande über mich. Aber während wir nicht picken: Ihre zweite Antwort fügt am Ende ein zusätzliches "," hinzu.
Konrad Rudolph