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();
dasblinkenlight
źródło
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();
khalid13
źródło
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)));
Justin Niessner
źródło
8

Trochę LINQ przechodzi długą drogę:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
źródło
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ą ...


źródło
tylko notatka dla każdego, kto nie jest zaznajomiony = .ToList<string>()nadal potrzebujeusing 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
źródło
2
Według docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/… Nie musisz dodawać .Select(x => x.Trim(), ponieważ Parse automatycznie przycina dla Ciebie wszystkie spacje.
Phillip Quinlan,
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();
Agustin Meriles
źródło
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
źródło
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ę.

SolidSnake4444
źródło
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.

drchanix
źródło
-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();
Parag555
źródło