2010-09-11 8 views

Répondre

28
int[] result = "158,141,90,86".Split(',').Select(int.Parse).ToArray(); 
17

comme ça, avec LINQ:

int[] array = s.Split(',') 
       .Select(x => int.Parse(x)) 
       .ToArray(); 

Notez que ce jetteront une exception si un élément du texte n'est pas un entier. Si vous voulez le rendre plus résilient (s'il s'agit de données entrées par l'utilisateur par exemple), vous devrez utiliser int.TryParse; À ce stade, la vie devient un peu plus compliquée en termes de requête LINQ.

EDIT: Pour faire analyser un int?[] (avec une valeur nulle correspondant à chaque sous-chaîne non valide), vous pouvez faire quelque chose comme:

int?[] array = s.Split(',') 
       .Select(x => { 
         int value; 
         return int.TryParse(x, out value) ? value : (int?)null; 
       }) 
       .ToArray(); 

Comme je l'ai dit, il est pas très agréable :(

EDIT: Dans les commentaires, Dan a commenté "l'obsession" de l'approche ci-dessus au lieu de (vraisemblablement) une approche plus impérative.A mon avis, même la seconde version moins agréable est encore plus facile à lire que l'alternative impérative. est seulement due à la nature laide de int.TryParse, qui n'est pas moins laide lorsqu'il est utilisé dans imper code actif.

Si int.TryParse a renvoyé int? ou Tuple<bool, int> alors ce serait aussi facile que la première version. Même la conversion de la forme de tuple à la forme annulable serait simple, avec une projection supplémentaire:

int[] array = s.Split(',') 
       .Select(x => int.TryParseTuple(x)) 
       .Select(tuple => tuple.First ? tuple.Second : (int?) null) 
       .ToArray(); 
+0

Pour être complet, comment cela changerait-il si vous deviez essayer d'analyser l'int? –

+0

@Chloe: Pour faire cela "juste", vous voudriez le changer en un tableau de 'int?'. –

+0

Dans sa réponse, Grif affirme que cela produit une erreur. J'avoue que je ne l'ai pas essayé, mais avez-vous besoin de le remplacer par 'return int.TryParse (x, out value)? (int?) value: null' pour que les deux branches de votre conditionnel aient le même type? –

1

Une solution impérative serait bien sûr:

 string[] sa = s.Split(','); 
     int?[] array = new int?[sa.Length]; 
     int value; 
     for (int i = 0; i < sa.Length; i++) 
      if (int.TryParse(sa[i], out value)) 
       array[i] = value; 
      else 
       array[i] = null; 
+0

@Andrey: Ah oui.Pas beaucoup mieux que mon code dans ce cas, mais pourrait être très utile dans d'autres situations. Bon à savoir c'est possible. Merci. – Grif

+0

@Grif: Il aurait été utile d'ajouter un commentaire à ma réponse pour me le faire savoir plutôt que d'ajouter votre propre réponse. Je l'ai réparé. –

+0

@Tim Goodman: Ahh oui! Silly comment j'ai manqué cette solution. – Grif

1

Une autre solution avec LINQ/int ? [] est:

return source.Split(',') 
       .Select(x => { 
         int? value = null; 
         int parsed; 
         if (int.TryParse(x, out parsed)) { 
          value = parsed; 
         } 
         return value; 
       }) 
       .ToArray(); 
Questions connexes