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();
dasblinkenlight
la source
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();
khalid13
la source
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)));
Justin Niessner
la source
8

Un petit LINQ va un long chemin:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
la source
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 ...


la source
juste une note pour quelqu'un qui n'est pas familier = a .ToList<string>()encore besoinusing System.Linq;
Bill Rawlinson
4
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();
Oybek
la source
2
Selon docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/… Vous n'avez pas besoin d'ajouter .Select(x => x.Trim(), car Parse coupe automatiquement tous les caractères d'espace pour vous.
Phillip Quinlan
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();
Agustin Meriles
la source
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
la source
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.

SolidSnake4444
la source
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.

drchanix
la source
-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();
Parag555
la source