Comment puis-je convertir une chaîne séparée par des virgules en une liste <int>


Réponses:


435

Voici une façon de procéder:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

11
Cela pourrait aussi êtreList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
Y a-t-il un besoin pour le new List<>?
LiquidPony

2
@LiquidPony no; vous pourriez appeler à la ToList()place; le résultat est essentiellement le même: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); vous devez faire l'un ou l'autre, cependant, car la valeur de retour de Select()est un IEnumerable<>, mais pas unList<>
phoog

@LiquidPony dans cette implémentation oui car l' Selectextension dans ce cas retourne IEnumerable<Int32>et ce n'est pas la liste. Cependant, list a un constructeur acceptant une autre collection comme source.
Oybek

8
Pour gérer le cas où les balises sont une chaîne vide, utilisezSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

25

Si vous souhaitez inclure une validation simple et ignorer les valeurs non valides (au lieu de lever une exception), voici quelque chose qui utilise TryParse:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

EDIT: Voici une requête mise à jour basée sur les commentaires d'Antoine. Il appelle TryParse d'abord pour filtrer les mauvaises valeurs, puis Parse pour effectuer la conversion réelle.

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

Edit 2: Une requête mise à jour pour C # 7.0, grâce aux commentaires de Charles Burns. Notez que nous nous débarrassons de la variable mos supplémentaire avec cette approche, donc c'est un peu plus propre.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
Échoue si 0 est une entrée légitime!
Antoine Meltzheim

2
Avec C # 7.0, vous pouvez omettre la déclaration de mos et remplacer l'appel TryParse parint.TryParse(m, out int _)
Charles Burns

14

Vous pouvez utiliser LINQ w / int.Parse()pour convertir le string[]en an IEnumerable<int>, puis transmettre ce résultat au List<T>constructeur:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));

8

Un petit LINQ va un long chemin:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();

6

Sans requête LINQ, vous pouvez choisir cette méthode,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

puis vous pouvez convertir cette liste en type entier ...


juste une note pour quelqu'un qui n'est pas familier = a .ToList<string>()encore besoinusing System.Linq;
Bill Rawlinson


2

Si vous utilisez C # 3.5, vous pouvez utiliser Linq pour y parvenir

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

ou le court

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();

2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

1

J'ai apporté une modification à la réponse de khalid13. Si l'utilisateur mettait une chaîne de "0", sa réponse supprimerait cela de la liste résultante. J'ai fait quelque chose de similaire mais j'ai utilisé un objet anonyme.

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection est une fonction personnalisée que j'ai créée qui protège si la chaîne est nulle.

Ce qui précède supprime toutes les chaînes qui n'ont pas pu être converties sans erreur. Si vous devez faire une erreur en cas de problème avec la conversion, la réponse acceptée devrait faire l'affaire.


1

Je suis tombé sur cela et je veux juste partager ma propre solution sans linq. Il s'agit d'une approche primitive. Les valeurs non entières ne seront pas ajoutées dans la liste également.

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

J'espère que cela t'aides.


-2

C'est simple. Divisez d'abord la chaîne. Supprimer l'espace vide présent après une virgule (,). Ensuite, utilisez ToList () définie par le système

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Pour supprimer l'espace après «,» et convertir ce texte séparé par des virgules en liste

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
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.