Was ist der sauberste Weg, um eine durch Kommas getrennte Liste von Zeichenfolgenwerten aus einem IList<string>
oder zu erstellen IEnumerable<string>
?
String.Join(...)
Es string[]
kann schwierig sein, mit einem zu arbeiten, wenn Typen wie IList<string>
oder IEnumerable<string>
nicht einfach in ein String-Array konvertiert werden können.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Antworten:
.NET 4+
Detail & Pre .Net 4.0-Lösungen
IEnumerable<string>
kann mit LINQ (.NET 3.5) sehr einfach in ein String-Array konvertiert werden :Es ist einfach genug, die entsprechende Hilfsmethode zu schreiben, wenn Sie Folgendes benötigen:
Dann nenne es so:
Sie können dann anrufen
string.Join
. Natürlich müssen Sie nicht haben , um eine Hilfsmethode zu verwenden:Letzteres ist allerdings ein bisschen mundvoll :)
Dies ist wahrscheinlich der einfachste und auch sehr performante Weg - es gibt andere Fragen dazu, wie die Aufführung genau aussieht, einschließlich (aber nicht beschränkt auf) diesen .
Ab .NET 4.0 sind mehr Überladungen in verfügbar
string.Join
, sodass Sie einfach schreiben können:Viel einfacher :)
quelle
List<T>
. Warum das Rad neu erfinden?ToList
. Es ist aber in Ordnung zu benutzenstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
.Zu Ihrer Information, die .NET 4.0-Version von
string.Join()
hat einige zusätzliche Überladungen , die mitIEnumerable
nur Arrays funktionieren , einschließlich eines, das mit jedem Typ umgehen kannT
:quelle
str = emps.Select(e => e.SSN).Join(",")
Der einfachste Weg, dies zu sehen, ist die Verwendung der LINQ-
Aggregate
Methode:quelle
Func<StringBuilder,string,StringBuider>
. Rufen Sie dann einfachToString()
den zurückgegebenen StringBuilder auf. Es ist natürlich nicht so hübsch :)input.Count
sollte mehr als 1 sein.Ich denke, dass der sauberste Weg, eine durch Kommas getrennte Liste von Zeichenfolgenwerten zu erstellen, einfach ist:
Hier ist ein vollständiges Beispiel:
Es ist nicht erforderlich, eine Hilfsfunktion zu erstellen. Diese ist in .NET 4.0 und höher integriert.
quelle
Im Vergleich zur Leistung ist der Gewinner "Loop it, sb.Append it und do back step". Tatsächlich ist "Aufzählung und manuelle Verschiebung als nächstes" das gleiche Gut (siehe stddev).
Code:
https://github.com/dotnet/BenchmarkDotNet wurde verwendet
quelle
Da ich hier angekommen bin, als ich nach einer bestimmten Eigenschaft einer Liste von Objekten gesucht habe (und nicht nach ToString ()), ist hier eine Ergänzung zu der akzeptierten Antwort:
quelle
Hier ist eine weitere Erweiterungsmethode:
quelle
Ich komme etwas spät zu dieser Diskussion, aber das ist mein Beitrag fwiw. Ich muss
IList<Guid> OrderIds
in eine CSV-Zeichenfolge konvertiert werden, aber das Folgende ist generisch und funktioniert unverändert mit anderen Typen:Kurz und bündig, verwendet StringBuilder zum Erstellen eines neuen Strings, verkleinert die StringBuilder-Länge um eins, um das letzte Komma zu entfernen, und gibt den CSV-String zurück.
Ich habe dies aktualisiert, um mehrere zu verwenden
Append()
, um Zeichenfolge + Komma hinzuzufügen. Aus James 'Feedback habe ich Reflector verwendet, um einen Blick darauf zu werfenStringBuilder.AppendFormat()
. Es stellt sich heraus, dassAppendFormat()
ein StringBuilder verwendet wird, um die Formatzeichenfolge zu erstellen, was sie in diesem Kontext weniger effizient macht als nur die Verwendung mehrerer ZeichenfolgenAppends()
.quelle
Etwas etwas flüchtig, aber es funktioniert:
Gibt Ihnen eine CSV aus einer Liste, nachdem Sie ihr den Konverter gegeben haben (in diesem Fall d => d.DivisionID.ToString ("b")).
Hacky aber funktioniert - könnte vielleicht zu einer Erweiterungsmethode gemacht werden?
quelle
So habe ich es gemacht, so wie ich es in anderen Sprachen gemacht habe:
quelle
Spezifisches Bedürfnis, wann wir umgeben sollten von ', von ex:
quelle
Wir haben eine Utility-Funktion, ungefähr so:
Was verwendet werden kann, um viele Sammlungen einfach zu verbinden:
Beachten Sie, dass wir den Sammlungsparameter vor dem Lambda haben, da Intellisense dann den Sammlungstyp aufnimmt.
Wenn Sie bereits eine Aufzählung von Zeichenfolgen haben, müssen Sie nur das ToArray ausführen:
quelle
Sie können die IList mit ToArray in ein Array konvertieren und dann einen Befehl string.join für das Array ausführen.
quelle
Sie können mithilfe der Linq-Erweiterungen in .NET 3.5 problemlos in ein Array konvertiert werden.
quelle
Sie können auch Folgendes verwenden, nachdem Sie es mit einer der von anderen aufgeführten Methoden in ein Array konvertiert haben:
Bearbeiten: Hier ist ein weiteres Beispiel
quelle
Ich habe dieses Problem gerade gelöst, bevor ich diesen Artikel gelesen habe. Meine Lösung sieht ungefähr so aus:
Genannt wie:
Ich hätte es auch genauso leicht ausdrücken können und wäre auch effizienter gewesen:
quelle
Meine Antwort ist wie oben Aggregatlösung, sollte aber weniger Call-Stack-lastig sein, da es keine expliziten Delegate-Aufrufe gibt:
Natürlich kann man die Signatur so erweitern, dass sie vom Trennzeichen unabhängig ist. Ich bin wirklich kein Fan des Aufrufs von sb.Remove () und möchte ihn so umgestalten, dass er eine direkte while-Schleife über eine IEnumerable ist, und mithilfe von MoveNext () bestimmen, ob ein Komma geschrieben werden soll oder nicht. Ich werde herumspielen und diese Lösung veröffentlichen, wenn ich darauf stoße.
Folgendes wollte ich anfangs:
Kein temporärer Array- oder Listenspeicher erforderlich und kein
StringBuilder
Remove()
oderLength--
Hack erforderlich.In meiner Framework-Bibliothek habe ich einige Variationen dieser Methodensignatur vorgenommen, wobei jede Kombination
delimiter
dieconverter
Parameter und die mit der Verwendung von","
bzw.x.ToString()
als Standard enthält.quelle
Hoffentlich ist dies der einfachste Weg
quelle
Ich bin auf diese Diskussion gestoßen, als ich nach einer guten C # -Methode gesucht habe, um Zeichenfolgen wie mit der MySql-Methode zu verbinden
CONCAT_WS()
. Diese Methode unterscheidet sich von derstring.Join()
Methode dadurch, dass das Trennzeichen nicht hinzugefügt wird, wenn Zeichenfolgen NULL oder leer sind.wird nur zurückgegeben,
Lastname
wenn der Vorname leer ist, währendwird zurückkehren
strLastname + ", "
im gleichen Fall zurückkehren.Ich wollte das erste Verhalten und schrieb die folgenden Methoden:
quelle
Ich habe einige Erweiterungsmethoden geschrieben, um dies auf effiziente Weise zu tun:
Das hängt davon ab
quelle
Sie können
.ToArray()
aufLists
und verwendenIEnumerables
und dann verwenden,String.Join()
wie Sie wollten.quelle
Wenn sich die Zeichenfolgen, denen Sie beitreten möchten, in der Liste der Objekte befinden, können Sie auch Folgendes tun:
quelle