J'ai un tableau d'entiers sous forme de chaîne:
var arr = new string[] { "1", "2", "3", "4" };
J'ai besoin d'un tableau de «vrais» entiers pour aller plus loin:
void Foo(int[] arr) { .. }
J'ai essayé de lancer int et cela a bien sûr échoué:
Foo(arr.Cast<int>.ToArray());
Je peux faire ensuite:
var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());
ou
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());
mais les deux ont l'air moche.
Existe-t-il d'autres moyens de terminer la tâche?
c#
.net
linq
extension-methods
abatishchev
la source
la source
Réponses:
Étant donné un tableau, vous pouvez utiliser la
Array.ConvertAll
méthode :Merci à Marc Gravell d'avoir souligné que le lambda peut être omis, ce qui donne une version plus courte illustrée ci-dessous:
Une solution LINQ est similaire, sauf que vous auriez besoin de l'
ToArray
appel supplémentaire pour obtenir un tableau:la source
ConvertAll(arr, int.Parse)
suffitArray.ConvertAll(arr, AddressOf Integer.Parse)
EDIT: pour convertir en tableau
Cela devrait faire l'affaire:
la source
Pour éviter les exceptions avec
.Parse
, voici quelques.TryParse
alternatives.Pour utiliser uniquement les éléments qui peuvent être analysés:
ou
Alternatives utilisant
0
pour les éléments qui ne peuvent pas être analysés:ou
C # 7.0 :
la source
var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();
renvoie juste les indécits 0,1,2, ... au lieu des valeurs réelles. Quelle est la bonne solution ici?new int[0]
? Quand j'ai du texte, je n'en ai pas0
dans mon tableau ...new int[0]
est un tableau int vide. Les deux premiers exemples ignorent les valeurs qui ne peuvent pas être analysées, et les deux derniers exemples utilisent0
pour les valeurs qui ne peuvent pas être analysées.new int[] {0}
. THX.vous pouvez simplement convertir un tableau de chaînes en tableau int en:
la source
Dim converted = arr.Select(addressof Integer.Parse)
Vous devez vous assurer que vous n'obtenez pas de
IEnumerable<int>
retourla source
la source