convertir la chaîne en int?

comment convertir un tableau de chaînes en tableau d’entiers Nullable.

Eh bien, les deux aspects sont les suivants:

  • Comment convertir un tableau d’un type à un autre?
  • Comment convertir une chaîne en un int nullable?

La première est simple: vous pouvez utiliser Array.ConvertAll , en passant un délégué Converter . Il existe également la méthode LINQ ( x.Select(...).ToArray() ), mais elle est légèrement moins efficace si vous savez que vous avez un tableau pour commencer et que vous voulez un tableau de l’autre extrémité 1 .

La ssortingng à int? est probablement mieux fait dans une méthode. Vous pouvez le faire dans une fonction anonyme, mais dans ce cas particulier, j’utiliserais une méthode distincte. J’aime rarement avoir à déclarer des variables dans une fonction anonyme.

 public static int? TryParseInt32(ssortingng text) { int value; return int.TryParse(text, out value) ? value : (int?) null; } 

Pour répondre au commentaire, oui vous avez besoin du casting 2 .

ou sans le conditionnel:

 public static int? TryParseInt32(ssortingng text) { int value; if (int.TryParse(text, out value)) { return value; } else { return null; } } 

Assemblez-les comme ceci:

 ssortingng[] x = {"15", "10", "hello", "5" }; int?[] y = Array.ConvertAll(x, TryParseInt32); 

1 Array.ConvertAll est plus efficace que x.Select().ToArray() car il contient plus d’informations. Il peut créer le tableau final immédiatement – aucun redimensionnement n’est nécessaire. L’appel de Enumerable.ToArray() (avec le résultat de Select() ) ne contient pas la même information et doit donc append les résultats à une List (potentiellement redimensionnant plusieurs fois au cours du processus), puis le redimensionner à la fin aussi. (Elle n’utilise pas en fait List mais les concepts sont les mêmes.) Il est intéressant de connaître la solution Select / ToArray, mais je ne pense pas qu’elle soit en réalité plus lisible que ConvertAll dans ce cas. Utilisez également le formulaire le plus efficace.

2 La raison pour laquelle vous avez besoin de la conversion conditionnelle est que le compilateur ne sait pas quel type de “null” vous voulez vraiment dire – mais il sait qu’il ne peut pas convertir de null en int . Le type de l’expression conditionnelle doit être soit le type du deuxième opérande, soit le type du troisième opérande, et l’autre doit être implicitement convertible. En forçant le troisième opérande à être de type int? ici tout va bien – parce que vous pouvez implicitement convertir d’ int à int? . Notez que le compilateur ne prend pas la façon dont vous utilisez l’expression pour essayer de trouver le type. Une autre alternative consiste à utiliser new int?() lieu de null .

En analysant et en utilisant Linq:

 ssortingng[] input = { "1", "3", "x" } var result = input.Select( s => { int i; return (int.TryParse(s, out i)) ? i : (int?) null; }).ToArray(); 

… Mais j’avoue que c’est un peu cryptique. Je ne voudrais pas utiliser une expression lambda ici. Pour plus de clarté, cela devrait appartenir à une fonction appropriée ParseNullableInt . Ensuite, vous pouvez l’appeler comme ceci:

 var result = input.Select(ParseNullableInt).ToArray(); 

Edit: J’ai supprimé le contrôle null / empty parce que TryParse gère correctement ces cas en renvoyant false.

 ssortingng[] ssortingngArray = ...; int?[] nullableIntArray = Array.ConvertAll(ssortingngArray, s => { int value; if (!int.TryParse(s, out value)) return default(int?); return (int?)value; }); 

Une option serait la suivante (je suppose que vous voulez des valeurs NULL pour les valeurs qui ne sont pas des valeurs entières):

 public static class SsortingngArrayExtension { public static int?[] ToNullableIntArray(this ssortingng[] array) { int?[] result = new int?[array.Length]; for (int index = 0; index < array.Length; index++) { string sourceValue = array[index]; int destinationValue; if (int.TryParse(sourceValue, out destinationValue)) { result[index] = destinationValue; } else { result[index] = null; } } return result; } } 

usage:

 ssortingng[] source = { "hello", "1", "3.1415", "20", "foo" }; int?[] dest = source.ToNullableIntArray(); 

Vous devez utiliser int.TryParse:

  ssortingng[] s = { "123", "a", "45" }; int?[] result = new int?[s.Length]; for (int i = 0; i < s.Length; ++i) { int a; if (int.TryParse(s[i], out a)) result[i] = a; } 
 List ints = new List(); foreach (ssortingng str in strs) { int val; if (int.TryParse(str, out val)) { ints.Add(val); } else { ints.Add(null); } } return ints.ToArray(); 

Un tableau entier ne peut pas être nul. En fait, chaque élément de Integer Array aura “0” par défaut.

Concernant la conversion

Créer un tableau entier de même longueur ou un arraylist

 int [] _arr=new int[strArray.length]; for(int i=0;i