Ich habe ein Array von Ganzzahlen in Zeichenfolgenform:
var arr = new string[] { "1", "2", "3", "4" };
Ich brauche eine Reihe von 'echten' ganzen Zahlen, um es weiter voranzutreiben:
void Foo(int[] arr) { .. }
Ich habe versucht, int zu besetzen und es ist natürlich gescheitert:
Foo(arr.Cast<int>.ToArray());
Ich kann als nächstes tun:
var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());
oder
var list = new List<int>(arr.Length);
arr.ForEach(i =>
{
int j;
if (Int32.TryParse(i, out j)) // TryParse is faster, yeah
{
list.Add(j);
}
}
Foo(list.ToArray());
aber beide sehen hässlich aus.
Gibt es andere Möglichkeiten, um die Aufgabe abzuschließen?
c#
.net
linq
extension-methods
abatishchev
quelle
quelle
Antworten:
Bei einem gegebenen Array können Sie die folgende
Array.ConvertAll
Methode verwenden :Vielen Dank an Marc Gravell für den Hinweis, dass das Lambda weggelassen werden kann, was zu einer kürzeren Version führt:
Eine LINQ-Lösung ist ähnlich, außer dass Sie den zusätzlichen
ToArray
Aufruf benötigen würden , um ein Array zu erhalten:quelle
ConvertAll(arr, int.Parse)
ist ausreichendArray.ConvertAll(arr, AddressOf Integer.Parse)
BEARBEITEN: Zum Konvertieren in ein Array
Dies sollte den Trick tun:
quelle
Um Ausnahmen mit zu vermeiden
.Parse
, finden Sie hier einige.TryParse
Alternativen.So verwenden Sie nur die Elemente, die analysiert werden können:
oder
Alternativen
0
für die Elemente, die nicht analysiert werden können:oder
C # 7.0 :
quelle
var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();
Gibt nur die Indizes 0,1,2, ... anstelle der realen Werte zurück. Was ist hier die richtige Lösung?new int[0]
? Wenn ich Text habe, bekomme ich keinen0
in meinem Array ...new int[0]
ist ein leeres int-Array. In den ersten beiden Beispielen werden Werte übersprungen, die nicht analysiert werden können, und in den letzten beiden Beispielen werden0
Werte verwendet, die nicht analysiert werden können.new int[] {0}
. Vielen Dank.Sie können einfach ein String-Array in ein int-Array umwandeln, indem Sie:
quelle
Dim converted = arr.Select(addressof Integer.Parse)
Stellen Sie sicher, dass Sie keine
IEnumerable<int>
Rückgabe erhaltenquelle
quelle