Come posso convertire una stringa separata da virgola in un Elenco <int>


Risposte:


435

Ecco un modo per farlo:

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

11
Potrebbe anche essereList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog,

2
C'è bisogno di new List<>?
LiquidPony,

2
@LiquidPony no; potresti chiamare ToList()invece; il risultato è essenzialmente lo stesso: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); devi fare l'uno o l'altro, però, perché il valore di ritorno di Select()è un IEnumerable<>, ma non unList<>
phoog

@LiquidPony in questa implementazione sì poiché l' Selectestensione in questo caso ritorna IEnumerable<Int32>e non è un elenco. Comunque la lista ha un costruttore che accetta un'altra collezione come sorgente.
Oybek,

8
Per gestire il caso in cui i tag sono una stringa vuota, utilizzareSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

25

Se desideri includere una semplice convalida e saltare valori non validi (anziché generare un'eccezione), ecco qualcosa che utilizza 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: ecco una query aggiornata basata sul feedback di Antoine. Chiama TryParse prima per filtrare eventuali valori errati, quindi Parse per eseguire la conversione effettiva.

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

Modifica 2: una query aggiornata per C # 7.0, grazie al feedback di Charles Burns. Si noti che ci liberiamo della variabile mos aggiuntiva con questo approccio, quindi è un po 'più pulito.

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
Non riesce se 0 è un input legittimo!
Antoine Meltzheim,

2
Con C # 7.0 puoi omettere la dichiarazione di mos e sostituire la chiamata TryParse conint.TryParse(m, out int _)
Charles Burns

14

Puoi usare LINQ w / int.Parse()per convertire il string[]in an IEnumerable<int>e poi passare quel risultato al List<T>costruttore:

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

8

Un piccolo LINQ fa molta strada:

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

6

Senza LINQ Query, puoi scegliere questo metodo,

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

e quindi puoi convertire questo elenco in tipo intero ...


solo una nota per chiunque non abbia familiarità = ha .ToList<string>()ancora bisognousing System.Linq;
Bill Rawlinson,


2

Se stai usando C # 3.5 puoi usare Linq per raggiungere questo obiettivo

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

o quello corto

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

Ho apportato una modifica alla risposta di khalid13. Se l'utente inserisse una stringa di "0", la sua risposta lo rimuoverà dall'elenco risultante. Ho fatto qualcosa di simile ma ho usato un oggetto anonimo.

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 è una funzione personalizzata che ho creato che protegge se la stringa è nulla.

Ciò che fa sopra è eliminare tutte le stringhe che non sono state in grado di essere convertite senza errori. Se devi sbagliare se si è verificato un problema con la conversione, la risposta accettata dovrebbe fare il trucco.


1

Mi sono imbattuto in questo e voglio solo condividere la mia soluzione senza linq. Questo è un approccio primitivo. I valori non interi non verranno aggiunti nell'elenco.

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);
    }
}

Spero che questo ti aiuti.


-2

È semplice. Dividi prima la stringa. Taglia spazio vuoto presente dopo la virgola (,). Quindi utilizzare ToList definito dal sistema ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Per rimuovere lo spazio dopo ',' e convertire questo testo separato da virgola in Elenco

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.