Das könnte auch seinList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
Phoog
2
Gibt es eine Notwendigkeit für die new List<>?
LiquidPony
2
@ LiquidPony nein; Sie könnten ToList()stattdessen anrufen ; das Ergebnis ist im Wesentlichen die gleiche: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); Sie müssen zwar das eine oder andere tun, weil der Rückgabewert Select()eine ist IEnumerable<>, aber nicht einList<>
phoog
@LiquidPony in dieser Implementierung ja, da die SelectErweiterung in diesem Fall zurückgegeben wird IEnumerable<Int32>und nicht aufgelistet ist. In list hat ein Konstruktor jedoch eine andere Sammlung als Quelle.
Oybek
8
Um den Fall zu behandeln, in dem Tags eine leere Zeichenfolge sind, verwenden SieSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill
24
Wenn Sie eine einfache Validierung einschließen und ungültige Werte überspringen möchten (anstatt eine Ausnahme auszulösen), verwendet TryParse Folgendes:
string csv ="1,2,3,4,a,5";int mos =0;var intList = csv.Split(',').Select(m =>{int.TryParse(m,out mos);return mos;}).Where(m => m !=0).ToList();//returns a list with integers: 1, 2, 3, 4, 5
BEARBEITEN: Hier ist eine aktualisierte Abfrage basierend auf dem Feedback von Antoine. Es ruft zuerst TryParse auf, um fehlerhafte Werte herauszufiltern, und dann Parse, um die eigentliche Konvertierung durchzuführen.
string csv ="1,2,3,4,a,5,0,3,r,5";int mos =0;var intList = csv.Split(',').Where(m =>int.TryParse(m,out mos)).Select(m =>int.Parse(m)).ToList();//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5
Bearbeiten 2: Eine aktualisierte Abfrage für C # 7.0 dank des Feedbacks von Charles Burns. Beachten Sie, dass wir mit diesem Ansatz die zusätzliche mos-Variable entfernen, sodass sie etwas sauberer ist.
Mit C # 7.0 können Sie die Deklaration von mos weglassen und den TryParse-Aufruf durchint.TryParse(m, out int _)
Charles Burns
14
Sie können LINQ w / verwenden int.Parse(), um das string[]in ein zu konvertieren IEnumerable<int>und dieses Ergebnis dann an den List<T>Konstruktor zu übergeben:
var tagIds =newList<int>(tags.Split(',').Select(s =>int.Parse(s)));
Ich habe die Antwort von khalid13 geändert. Wenn der Benutzer eine Zeichenfolge mit "0" eingeben würde, würde seine Antwort diese aus der resultierenden Liste entfernen. Ich habe etwas Ähnliches gemacht, aber ein anonymes Objekt verwendet.
var result = commaSeparatedString.Split(newchar[]{','},StringSplitOptions.RemoveEmptyEntries).Select(s =>new{ didConvert =int.TryParse(s.TrimNullProtection(),out convertedInt), convertedValue = convertedInt }).Where(w => w.didConvert).Select(s => s.convertedValue).ToList();
TrimNullProtection ist eine benutzerdefinierte Funktion, die ich erstellt habe und die schützt, wenn die Zeichenfolge null ist.
Das oben Gesagte entfernt alle Zeichenfolgen, die nicht fehlerfrei konvertiert werden konnten. Wenn Sie einen Fehler machen müssen, wenn ein Problem mit der Konvertierung aufgetreten ist, sollte die akzeptierte Antwort den Trick tun.
Ich bin darauf gestoßen und möchte nur meine eigene Lösung ohne linq teilen. Dies ist ein primitiver Ansatz. Nicht ganzzahlige Werte werden ebenfalls nicht zur Liste hinzugefügt.
List<int>TagIds=newList<int>();string[] split = tags.Split(',');foreach(string item in split){int val =0;if(int.TryParse(item,out val)==true){TagIds.Add(val);}}
Antworten:
Hier ist eine Möglichkeit, dies zu tun:
quelle
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?ToList()
stattdessen anrufen ; das Ergebnis ist im Wesentlichen die gleiche:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
Sie müssen zwar das eine oder andere tun, weil der RückgabewertSelect()
eine istIEnumerable<>
, aber nicht einList<>
Select
Erweiterung in diesem Fall zurückgegeben wirdIEnumerable<Int32>
und nicht aufgelistet ist. In list hat ein Konstruktor jedoch eine andere Sammlung als Quelle.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Wenn Sie eine einfache Validierung einschließen und ungültige Werte überspringen möchten (anstatt eine Ausnahme auszulösen), verwendet TryParse Folgendes:
BEARBEITEN: Hier ist eine aktualisierte Abfrage basierend auf dem Feedback von Antoine. Es ruft zuerst TryParse auf, um fehlerhafte Werte herauszufiltern, und dann Parse, um die eigentliche Konvertierung durchzuführen.
Bearbeiten 2: Eine aktualisierte Abfrage für C # 7.0 dank des Feedbacks von Charles Burns. Beachten Sie, dass wir mit diesem Ansatz die zusätzliche mos-Variable entfernen, sodass sie etwas sauberer ist.
quelle
int.TryParse(m, out int _)
Sie können LINQ w / verwenden
int.Parse()
, um dasstring[]
in ein zu konvertierenIEnumerable<int>
und dieses Ergebnis dann an denList<T>
Konstruktor zu übergeben:quelle
Ein kleiner LINQ reicht weit:
quelle
Ohne LINQ-Abfrage können Sie diese Methode auswählen:
und dann können Sie diese Liste in einen ganzzahligen Typ konvertieren ...
quelle
.ToList<string>()
noch brauchenusing System.Linq;
quelle
.Select(x => x.Trim()
, da Parse automatisch alle Leerzeichen für Sie schneidet .Wenn Sie C # 3.5 verwenden, können Sie Linq verwenden, um dies zu erreichen
oder der kurze
quelle
quelle
Ich habe die Antwort von khalid13 geändert. Wenn der Benutzer eine Zeichenfolge mit "0" eingeben würde, würde seine Antwort diese aus der resultierenden Liste entfernen. Ich habe etwas Ähnliches gemacht, aber ein anonymes Objekt verwendet.
TrimNullProtection ist eine benutzerdefinierte Funktion, die ich erstellt habe und die schützt, wenn die Zeichenfolge null ist.
Das oben Gesagte entfernt alle Zeichenfolgen, die nicht fehlerfrei konvertiert werden konnten. Wenn Sie einen Fehler machen müssen, wenn ein Problem mit der Konvertierung aufgetreten ist, sollte die akzeptierte Antwort den Trick tun.
quelle
Ich bin darauf gestoßen und möchte nur meine eigene Lösung ohne linq teilen. Dies ist ein primitiver Ansatz. Nicht ganzzahlige Werte werden ebenfalls nicht zur Liste hinzugefügt.
Hoffe das hilft.
quelle
Es ist einfach. Teilen Sie zuerst die Zeichenfolge. Leerzeichen nach Komma (,) kürzen. Verwenden Sie dann die vom System definierte ToList ()
Um das Leerzeichen nach ',' zu entfernen und diesen durch Kommas getrennten Text in Liste umzuwandeln
quelle