HOWTO · Csharp
Convertir un tableau de chaînes en tableau Int en C#
Dans ce guide, nous allons apprendre à convertir un tableau de chaînes en un tableau int en C#.
Sur cette page
Ce guide explique comment convertir un tableau string en tableau int en C#. Comme chaque élément est fourni sous forme de texte, chaque valeur doit être analysée comme un entier. Trois approches couvrent cette tâche : Array.ConvertAll, une projection LINQ Select avec int.Parse, et la même projection appuyée sur int.TryParse pour les entrées qui pourraient ne pas être analysées correctement.
Convertir un tableau de chaînes avec Array.ConvertAll
Array.ConvertAll applique une fonction de conversion à chaque élément d’un tableau source et retourne un nouveau tableau du type cible. Passer le groupe de méthodes int.Parse comme convertisseur permet d’analyser chaque chaîne en une seule instruction.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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
Le résultat est un nouveau int[] ; le string[] d’origine reste inchangé. Array.ConvertAll est un bon choix par défaut lorsque chaque élément doit être converti de la même manière et qu’aucune projection supplémentaire n’est nécessaire. Comme int.Parse effectue la conversion, chaque élément doit être un entier correctement formé, compris dans la plage Int32, et les règles d’analyse décrites dans les sections suivantes s’appliquent également ici.
Convertir un tableau de chaînes avec Select de LINQ et int.Parse
La méthode Select de LINQ projette chaque élément de la séquence source au moyen d’une fonction. Select(int.Parse) produit un IEnumerable<int> plutôt qu’un tableau ; ToArray est donc nécessaire pour matérialiser les résultats dans un int[]. Cette forme convient naturellement lorsque la conversion fait partie d’un pipeline LINQ plus long, par exemple pour filtrer des valeurs avant de les analyser.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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
Notez que Select est paresseuse : aucune valeur n’est analysée tant que la séquence n’est pas énumérée, et ToArray effectue cette énumération exactement une fois. int.Parse est strict : il lève une FormatException lorsqu’une valeur n’est pas numérique et une OverflowException lorsqu’elle se situe en dehors de la plage Int32. Les deux approches ci-dessus présentent ce comportement, que la troisième approche permet de gérer.
Gérer les valeurs non valides avec int.TryParse
int.TryParse retourne un bool au lieu de lever une exception ; elle tolère donc les valeurs qui ne peuvent pas être analysées et écrit le nombre analysé dans un paramètre out que l’expression lambda expose sous le nom result. Dans Select, l’expression lambda retourne la valeur analysée en cas de succès et, sinon, une valeur de repli choisie. Le programme ci-dessous remplace par 0 toute valeur dont l’analyse échoue :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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
Choisissez la valeur de repli avec soin : un 0 substitué est impossible à distinguer d’un véritable 0 dans le résultat. Si cette ambiguïté est inacceptable, consignez les échecs séparément : excluez les valeurs non analysées, utilisez une valeur sentinelle telle que -1, ou collectez les chaînes problématiques pour la journalisation.
Pour choisir rapidement entre ces approches, utilisez Array.ConvertAll lorsqu’une conversion directe en un seul appel suffit, Select avec int.Parse lorsque la conversion s’intègre dans un pipeline LINQ, et int.TryParse lorsque l’entrée n’est pas fiable et qu’une valeur de repli documentée est acceptable.