HOWTO · Csharp
Konvertieren ein String-Array in ein Int-Array in C#
In diesem Handbuch erfahren Sie, wie Sie in C# ein String-Array in ein Int-Array konvertieren.
Auf dieser Seite
Dieser Leitfaden zeigt, wie Sie ein string-Array in C# in ein int-Array konvertieren. Da jedes Element als Text vorliegt, muss jeder Wert in eine ganze Zahl geparst werden. Drei Muster decken die Aufgabe ab: Array.ConvertAll, eine LINQ-Select-Projektion mit int.Parse und dieselbe Projektion auf Basis von int.TryParse für Eingaben, die sich möglicherweise nicht sauber parsen lassen.
Ein String-Array mit Array.ConvertAll konvertieren
Array.ConvertAll wendet eine Konverterfunktion auf jedes Element eines Quellarrays an und gibt ein neues Array des Zieltyps zurück. Wird die int.Parse-Methodengruppe als Konverter übergeben, wird jeder String in einer einzigen Anweisung geparst.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
using System;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = Array.ConvertAll(temp_str, int.Parse);
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
Das Ergebnis ist ein neues int[]; das ursprüngliche string[] bleibt unverändert. Array.ConvertAll ist ein guter Standard, wenn jedes Element auf dieselbe Weise konvertiert werden soll und keine weitere Projektion erforderlich ist. Da int.Parse die Konvertierung ausführt, muss jedes Element eine wohlgeformte ganze Zahl im Int32-Bereich sein, und die in den nächsten Abschnitten beschriebenen Parsing-Regeln gelten auch hier.
Ein String-Array mit LINQ Select und int.Parse konvertieren
Die Select-Methode von LINQ projiziert jedes Element der Quellsequenz mithilfe einer Funktion. Select(int.Parse) erzeugt ein IEnumerable<int> und kein Array, daher ist ToArray erforderlich, um die Ergebnisse zu einem int[] zu materialisieren. Diese Form passt besonders gut, wenn die Konvertierung Teil einer längeren LINQ-Pipeline ist, etwa um Werte vor dem Parsen zu filtern.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = temp_str.Select(int.Parse).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
Beachten Sie, dass Select verzögert ausgewertet wird: Es wird nichts geparst, bis die Sequenz durchlaufen wird, und ToArray führt diesen Durchlauf genau einmal aus. int.Parse ist strikt – es löst eine FormatException aus, wenn ein Wert nicht numerisch ist, und eine OverflowException, wenn er außerhalb des Int32-Bereichs liegt. Beide oben gezeigten Muster weisen dieses Verhalten auf; genau das behandelt der dritte Ansatz.
Ungültige Werte mit int.TryParse behandeln
int.TryParse gibt einen bool zurück, statt eine Ausnahme auszulösen, und toleriert daher Werte, die nicht geparst werden können. Die geparste Zahl wird in einen out-Parameter geschrieben, den der Lambdaausdruck als result bereitstellt. Innerhalb von Select gibt der Lambdaausdruck bei Erfolg den geparsten Wert und andernfalls einen gewählten Ersatzwert zurück. Das folgende Programm ersetzt jeden Wert, der nicht geparst werden kann, durch 0:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "abc", "3000" };
int[] temp_int = temp_str.Select(s => int.TryParse(s, out int result) ? result : 0).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
0
3000
Wählen Sie den Ersatzwert bewusst: Eine eingesetzte 0 ist im Ergebnis nicht von einer tatsächlich vorhandenen 0 zu unterscheiden. Wenn diese Mehrdeutigkeit nicht akzeptabel ist, erfassen Sie die Fehler separat – filtern Sie die nicht geparsten Werte heraus, verwenden Sie einen Sentinel-Wert wie -1 oder sammeln Sie die betroffenen Strings für die Protokollierung.
Für eine schnelle Entscheidung zwischen den Mustern gilt: Verwenden Sie Array.ConvertAll, wenn nur eine direkte Konvertierung mit einem einzigen Aufruf nötig ist, Select mit int.Parse, wenn die Konvertierung innerhalb einer LINQ-Pipeline erfolgt, und int.TryParse, wenn die Eingabe nicht vertrauenswürdig ist und ein dokumentierter Ersatzwert akzeptabel ist.