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

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

ten robi praca powodować metodę podziału zwraca string []Jak mogę przekonwertować ciąg oddzielonych przecinkami do listy <int>

Proszę o pomoc.

+1

możliwy duplikat [Jak utworzyć listę z ciągu oddzielanego przecinkami?] (Http: // stackoverflow.com/questions/910119/how-to-create-a-listt-from-a-comma-separated-string) – Lijo

+0

Możliwy duplikat [Konwertuj oddzielone przecinkami ciągi int do int tablicy] (https://stackoverflow.com/ pytania/1763613/konwersja-oddzielony-ciąg-od-int-do-tablicy-int) – Lijo

Odpowiedz

308

Oto jeden sposób to zrobić:

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

Może to być również 'List TagIds = new List (tags.Split (','). Wybierz (int.Parse)); ' – phoog

+2

Czy jest potrzeba" nowej listy <> "? – LiquidPony

+2

@LiquidPony no; możesz zamiast tego nazwać 'ToList()'; wynik jest w zasadzie taki sam: 'List TagIds = tags.Split (','). Wybierz (int.Parse) .ToList();' Musisz jednak wykonać jedną lub drugą, ponieważ zwracana jest wartość '. Select() 'jest' IEnumerable <> ', ale nie' List <> ' – phoog

11

Można użyć LINQ w/int.Parse() do konwersji string[] do IEnumerable<int> a następnie przekazać ten wynik do konstruktora List<T>:

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

Mały LINQ ma długą drogę:

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

Jeśli używasz C# 3.5 można używać LINQ to osiągnąć

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

lub krótka

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

Bez LINQ kwerendy, można wybrać tę metodę,

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

a następnie możesz przekonwertować tę listę na liczbę całkowitą yp ...

10

Jeśli chcesz dołączyć kilka prostych walidacji i przeskoczyć nieprawidłowe wartości (zamiast rzucać wyjątek), tutaj jest coś, co wykorzystuje 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: Oto uaktualniony zapytanie oparte na opiniach Antoine'a. Najpierw wywołuje funkcję TryParse, aby odfiltrować wszelkie złe wartości, a następnie Parsuj, aby wykonać rzeczywistą konwersję.

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

Przerywa, jeśli 0 jest jednym z legalnych danych wejściowych! –

1

Wprowadziłem modyfikację odpowiedzi Khalid13. Jeśli użytkownik wstawił ciąg "0", jego odpowiedź usunie to z wynikowej listy. Zrobiłem coś podobnego, ale użyłem anonimowego obiektu.

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 to funkcja niestandardowa, którą robię, która chroni, jeśli ciąg znaków jest pusty.

To, co powyżej, usuwa wszelkie ciągi, które nie mogły zostać przekonwertowane bez błędu. Jeśli potrzebujesz błędu, jeśli wystąpił problem z konwersją, zaakceptowana odpowiedź powinna wystarczyć.

1

Natknąłem się na to i chcę tylko udostępnić własne rozwiązanie bez linq. To jest prymitywne podejście. Wartości niecałkowite również nie zostaną dodane do listy.

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

Mam nadzieję, że to pomoże.

Powiązane problemy