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

uzay95
la source
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();
mqp
la source
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();
Joze
la source
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) );
yuxio
la source
18

Meilleure utilisation int.TryParsepour éviter les exceptions;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();
aozogul
la source
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();
Mukesh Kalgude
la source
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(',');
Pcodea Xonos
la source
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.

HyoJin KIM
la source
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));
Adrian Filip
la source
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(); 
}
Carlos Toledo
la source
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();
Charanjot
la source
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