2012-02-15 17 views
130
string tags = "9,3,12,43,2" 

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

Questo non funziona sì che il metodo split restituisce una stringa []Come posso convertire virgola stringa separata in un elenco <int>

prega di aiuto.

+1

possibile duplicato di [Come creare un elenco da una stringa separata da virgole?] (Http: // stackoverflow.it/questions/910119/how-to-create-a-listt-from-a-comma-separated-string) – Lijo

+0

Possibile duplicato di [Converti una stringa separata da virgola di int in array int] (https://stackoverflow.com/ domande/1763613/convert-comma-separated-string-of-ints-to-int-array) – Lijo

risposta

308

Ecco un modo per farlo:

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

Questo potrebbe anche essere 'Elenco TagIds = nuovo Elenco (tag.Split (','). Select (int.Parse)); ' – phoog

+2

È necessario il' nuovo Elenco <> '? – LiquidPony

+2

@LiquidPony no; potresti invece chiamare 'ToList()'; il risultato è essenzialmente lo stesso: 'Elenco TagIds = tags.Split (','). Select (int.Parse) .ToList();' È necessario eseguire l'uno o l'altro, tuttavia, poiché il valore restituito di ' Select() 'è un' IEnumerable <> ', ma non un' List <> ' – phoog

11

È possibile utilizzare LINQ w/int.Parse() per convertire il string[] a un IEnumerable<int> e quindi passare tale risultato al List<T> costruttore:

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

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

Un po 'di LINQ ha una lunga strada:

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

Se si sta utilizzando C# 3.5 è possibile utilizzare 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(); 
3
string tags = "9,3,12,43,2"; 
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); 
5

Senza LINQ Query, è possibile scegliere questo metodo,

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

e quindi è possibile convertire questo elenco in numero intero t ipo ...

10

Se si desidera includere qualche semplice validazione e saltare valori non validi (invece di lanciare 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 un aggiornamento query basata sul feedback di Antoine. Prima chiama TryParse 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 
+0

Errore se 0 è un ingresso legit! –

1

Ho apportato una modifica alla risposta di khalid13. Se l'utente inserisce una stringa di "0", la sua risposta rimuoverà quella 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 creata che protegge se la stringa è nullo.

Quanto sopra non esclude le stringhe che non potevano essere convertite senza errori. Se hai bisogno di errore se c'è stato un problema con la conversione, allora 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 anche 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 aiuti.

Problemi correlati