Wie kann ich eine durch Kommas getrennte Zeichenfolge in eine Liste <int> konvertieren?

Antworten:

432

Hier ist eine Möglichkeit, dies zu tun:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
dasblinkenlight
quelle
11
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.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();
khalid13
quelle
1
Schlägt fehl, wenn 0 eine legitime Eingabe ist!
Antoine Meltzheim
2
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 = new List<int>(tags.Split(',').Select(s => int.Parse(s)));
Justin Niessner
quelle
8

Ein kleiner LINQ reicht weit:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
quelle
6

Ohne LINQ-Abfrage können Sie diese Methode auswählen:

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

und dann können Sie diese Liste in einen ganzzahligen Typ konvertieren ...


quelle
Nur eine Notiz an alle, die nicht vertraut sind = .ToList<string>()noch brauchenusing System.Linq;
Bill Rawlinson
2

Wenn Sie C # 3.5 verwenden, können Sie Linq verwenden, um dies zu erreichen

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

oder der kurze

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();
Agustin Meriles
quelle
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
quelle
1

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(new char[] { ',' }, 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.

SolidSnake4444
quelle
1

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 = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

Hoffe das hilft.

drchanix
quelle
-2

Es ist einfach. Teilen Sie zuerst die Zeichenfolge. Leerzeichen nach Komma (,) kürzen. Verwenden Sie dann die vom System definierte ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Um das Leerzeichen nach ',' zu entfernen und diesen durch Kommas getrennten Text in Liste umzuwandeln

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Parag555
quelle