Ich habe eine Reihe von ganzen Zahlen:
int[] number = new int[] { 2,3,6,7 };
Was ist der einfachste Weg, diese in eine einzelne Zeichenfolge umzuwandeln, bei der die Zahlen durch ein Zeichen getrennt sind (wie :) "2,3,6,7"
?
Ich bin in C # und .NET 3.5.
.NET 4.0
sofort gibt es Methoden, die ein Array von Objekten und eine IEnumerable verwenden, sodass Sie dies einfach tun könnenstring.join(",", number)
. Ich weiß, dass die Frage .NET 3.5 spezifiziert, daher habe ich dies nicht als Antwort angegeben, aber sie taucht bei Suchvorgängen auf, bei denen keine Version angegeben ist, und zu wissen, dass dies in 4.0 möglich ist, könnte jemandem helfen.Antworten:
BEARBEITEN : Ab (mindestens) .NET 4.5,
ist äquivalent zu:
EDIT :
Ich sehe mehrere Lösungen, die die Verwendung von StringBuilder bewerben. Jemand beschwert sich, dass die Join-Methode ein IEnumerable-Argument annehmen sollte.
Ich werde dich enttäuschen :) String.Join erfordert Array aus einem einzigen Grund - Leistung. Die Join-Methode muss die Größe der Daten kennen, um die erforderliche Speichermenge effektiv vorzuweisen.
Hier ist ein Teil der internen Implementierung der String.Join-Methode:
Ich bin zu faul, um die Leistung der vorgeschlagenen Methoden zu vergleichen. Aber irgendetwas sagt mir, dass Join gewinnen wird :)
quelle
using System.Linq;
Wird benötigt.Obwohl das OP .NET 3.5 angegeben hat, können Benutzer, die dies in .NET 2.0 mit C # 2 tun möchten, Folgendes tun:
Ich finde, es gibt eine Reihe anderer Fälle, in denen die Verwendung der Convert.xxx-Funktionen eine bessere Alternative zu einem Lambda darstellt, obwohl das Lambda in C # 3 die Typinferenzierung unterstützen könnte.
Eine ziemlich kompakte C # 3-Version, die mit .NET 2.0 funktioniert, ist folgende:
quelle
Eine Mischung der beiden Ansätze wäre das Schreiben einer Erweiterungsmethode auf IEnumerable <T>, die einen StringBuilder verwendet. Hier ist ein Beispiel mit unterschiedlichen Überladungen, je nachdem, ob Sie die Transformation angeben oder sich nur auf einfachen ToString verlassen möchten. Ich habe die Methode "JoinStrings" anstelle von "Join" genannt, um Verwechslungen mit dem anderen Join-Typ zu vermeiden. Vielleicht kann sich jemand einen besseren Namen einfallen lassen :)
quelle
Wir müssen jedes Element in ein konvertieren,
String
bevor wir es verbinden können. Daher ist es sinnvoll,Select
einen Lambda-Ausdruck zu verwenden. Dies entsprichtmap
einigen anderen Sprachen. Dann müssen wir die resultierende Sammlung von Zeichenfolgen zurück in ein Array konvertieren, daString.Join
nur ein Zeichenfolgenarray akzeptiert wird.Das
ToArray()
ist etwas hässlich finde ich.String.Join
sollte wirklich akzeptierenIEnumerable<String>
, gibt es keinen Grund, es nur auf Arrays zu beschränken. Dies liegt wahrscheinlich nur daranJoin
, dass es sich um frühere Generika handelt, als Arrays die einzige verfügbare typisierte Sammlung waren.quelle
Wenn Ihr Array von Ganzzahlen möglicherweise groß ist, erzielen Sie mit einem StringBuilder eine bessere Leistung. Z.B:
Bearbeiten: Als ich dies veröffentlichte, hatte ich den falschen Eindruck, dass "StringBuilder.Append (int value)" es intern geschafft hat, die Zeichenfolgendarstellung des ganzzahligen Werts anzuhängen, ohne ein Zeichenfolgenobjekt zu erstellen. Dies ist falsch: Die Überprüfung der Methode mit Reflector zeigt, dass einfach value.ToString () angehängt wird.
Daher besteht der einzige mögliche Leistungsunterschied darin, dass diese Technik die Erstellung eines Arrays vermeidet und die Zeichenfolgen für die Speicherbereinigung etwas früher freigibt. In der Praxis macht dies keinen messbaren Unterschied, daher habe ich diese bessere Lösung positiv bewertet .
quelle
Die Frage ist nach "der einfachsten Möglichkeit, diese in eine einzelne Zeichenfolge umzuwandeln, bei der die Zahlen durch ein Zeichen getrennt sind".
Der einfachste Weg ist:
BEARBEITEN: Dies funktioniert nur in .NET 4.0+. Beim ersten Lesen der Frage habe ich die .NET 3.5-Anforderung übersehen.
quelle
Ich stimme dem Lambda-Ausdruck für Lesbarkeit und Wartbarkeit zu, aber es wird nicht immer die beste Option sein. Der Nachteil bei der Verwendung der Ansätze IEnumerable / ToArray und StringBuilder besteht darin, dass eine Liste mit Elementen oder Zeichen dynamisch erweitert werden muss, da sie nicht wissen, wie viel Speicherplatz für die endgültige Zeichenfolge benötigt wird.
Wenn der seltene Fall, in dem Geschwindigkeit wichtiger als Prägnanz ist, ist das Folgende effizienter.
quelle
Ich dachte auch, es gäbe einen einfacheren Weg. Sie wissen nichts über Leistung, hat jemand eine (theoretische) Idee?
quelle
Substring(1)
, um das zu beheben (es war aus dem Speicher).In .NET 4.0 hat der String-Join eine Überladung für
params object[]
, daher ist dies so einfach wie:Beispiel
In .NET 2.0 ist es ein bisschen schwieriger, da es keine solche Überlastung gibt. Sie benötigen also Ihre eigene generische Methode:
In .NET 3.5 können Sie Erweiterungsmethoden verwenden:
Sie können also die JoinArray-Erweiterungsmethode verwenden.
Sie können diese Erweiterungsmethode auch in .NET 2.0 verwenden, wenn Sie Ihrem Code das ExtensionAttribute hinzufügen:
quelle
Du kannst tun
Auschecken
Durch Trennzeichen getrenntes ToString für Array, Liste, Wörterbuch, generisches IEnumerable
quelle