Jak przekonwertować ciąg oddzielony przecinkami na List <int>


Odpowiedzi:


432

Oto jeden ze sposobów, aby to zrobić:

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

11
To może być takżeList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
Czy jest taka potrzeba new List<>?
LiquidPony

2
@LiquidPony no; możesz ToList()zamiast tego zadzwonić ; wynik jest w zasadzie taki sam: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); musisz jednak zrobić jedno lub drugie, ponieważ zwracana wartość Select()to IEnumerable<>, ale nieList<>
phoog

@LiquidPony w tej implementacji tak, ponieważ Selectrozszerzenie w tym przypadku powraca IEnumerable<Int32>i nie jest listą. Jednak lista ma konstruktor akceptujący inną kolekcję jako źródło.
Oybek

8
Aby obsłużyć przypadek, w którym tagi są pustymi ciągami, użyjSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

Jeśli chcesz dołączyć prostą weryfikację i pominąć niepoprawne wartości (zamiast zgłaszać wyjątek), oto coś, co używa 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

EDYCJA: Oto zaktualizowane zapytanie oparte na opiniach Antoine. Wywołuje TryParse najpierw, aby odfiltrować wszelkie złe wartości, a następnie Parsuj, aby dokonać faktycznej konwersji.

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

Edycja 2: Zaktualizowana kwerenda dla C # 7.0, dzięki opiniom Charlesa Burnsa. Zauważ, że dzięki temu podejściu pozbywamy się dodatkowej zmiennej mos, więc jest ona nieco czystsza.

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
Nie powiedzie się, jeśli 0 to jedno prawidłowe wejście!
Antoine Meltzheim,

2
W wersji C # 7.0 możesz pominąć deklarację mos i zastąpić wywołanie TryParseint.TryParse(m, out int _)
Charles Burns

14

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

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

8

Trochę LINQ przechodzi długą drogę:

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

6

Bez zapytania LINQ możesz 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ą ...


tylko notatka dla każdego, kto nie jest zaznajomiony = .ToList<string>()nadal potrzebujeusing System.Linq;
Bill Rawlinson


2

Jeśli używasz C # 3.5, możesz użyć Linq, aby to osiągnąć

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

lub krótki

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

Zmodyfikowałem odpowiedź khalid13. Jeśli użytkownik wstawi ciąg „0”, jego odpowiedź usunie go 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 stworzona przeze mnie niestandardowa funkcja, która chroni, jeśli ciąg znaków jest pusty.

Powyższe powoduje usunięcie ciągów, których nie można było przekonwertować bez błędu. Jeśli potrzebujesz błędu, jeśli wystąpił problem z konwersją, zaakceptowana odpowiedź powinna załatwić sprawę.


1

Natknąłem się na to i chcę po prostu podzielić się własnym rozwiązaniem bez linq. To prymitywne podejście. Wartości inne niż całkowite nie zostaną również 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.


-2

To proste. Najpierw podziel sznurek. Przytnij puste miejsce po przecinku (,). Następnie użyj zdefiniowanej przez system ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Aby usunąć spację po „,” i przekonwertować ten tekst rozdzielony przecinkami na List

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.