Diviser la chaîne, convertir ToList <int> () en une ligne


192

J'ai une chaîne qui a des nombres

string sNumbers = "1,2,3,4,5";

Je peux le diviser puis le convertir en List<int>

sNumbers.Split( new[] { ',' } ).ToList<int>();

Comment puis-je convertir un tableau de chaînes en liste d'entiers? Pour que je puisse me convertir string[]enIEnumerable


Nous avions exactement la même question aujourd'hui: Click me
Dario

3
en "une ligne" si un très fort est une exigence très stricte! </perl>
dfa

2
Cette question dit spécifiquement de diviser une chaîne de nombres, ce qui simplifie la réponse. La question que Dario a mentionnée gère (s'enlise?) Les problèmes de TryParse pour les chaînes générales.
revoir

Réponses:


468
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();

4
Cela obtient une exception lorsque la liste a une valeur vide ou nulle.
Sayed Muhammad Idrees

@ SayedM.Idrees vérifie simplement null ou vide avant de fractionner.
RAVI VAGHELA

31

Vous pouvez également le faire de cette façon sans avoir besoin de Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();

18

La manière de Joze a également besoin de LINQ, ToList()est dans l' System.Linqespace de noms.

Vous pouvez convertir Array en List sans Linq en passant le tableau au constructeur List:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

18

Meilleure utilisation int.TryParsepour éviter les exceptions;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();

10

Il est également possible d'intégrer un tableau pour affecter directement une valeur.

comme ça

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();

4

vous pouvez également utiliser cette méthode d'extension

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

usage:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');

3

Sur Unity3d, int.Parsene fonctionne pas bien. Donc j'utilise comme ci-dessous.

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

J'espère que cette aide pour les utilisateurs d'Unity3d.


3

Vous pouvez utiliser les nouvelles fonctionnalités du langage C # 6.0:

  • remplacer le délégué (s) => { return Convert.ToInt32(s); }par le groupe de méthodes correspondantConvert.ToInt32
  • remplacer l'appel de constructeur redondant: new Converter<string, int>(Convert.ToInt32)par:Convert.ToInt32

Le résultat sera:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));

2

Mon problème était similaire mais avec l'inconvénient que parfois la chaîne contient des lettres (parfois vides).

string sNumbers = "1,2,hh,3,4,x,5";

Essayer de suivre la méthode d'extension Pcode Xonos:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}

1
Merci, bien que vous déclariez un séparateur et que vous ne l'utilisiez pas.
Hugo Delsing

-2

Vous pouvez utiliser ceci:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();

2
Bienvenue dans Stack Overflow! Bien que cet extrait de code puisse résoudre la question, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, car cela réduit la lisibilité du code et des explications!
Au revoir StackExchange

2
La fonction ConvertIntoIntList ne se ferme pas.
Federico Navarrete

En outre, vous devez ajouter la classe suivante: classe publique statique HelperMethods {liste publique statique <int> ConvertIntoIntList (cette chaîne [] stringList) {int x = 0; var intList = stringList.Where (str => int.TryParse (str, out x)) .Select (str => x) .ToList (); return intList; }}
Federico Navarrete
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.