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.
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(newchar[]{','},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ę.
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=newList<int>();string[] split = tags.Split(',');foreach(string item in split){int val =0;if(int.TryParse(item,out val)==true){TagIds.Add(val);}}
Odpowiedzi:
Oto jeden ze sposobów, aby to zrobić:
źródło
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?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()
toIEnumerable<>
, ale nieList<>
Select
rozszerzenie w tym przypadku powracaIEnumerable<Int32>
i nie jest listą. Jednak lista ma konstruktor akceptujący inną kolekcję jako źródło.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Jeśli chcesz dołączyć prostą weryfikację i pominąć niepoprawne wartości (zamiast zgłaszać wyjątek), oto coś, co używa TryParse:
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.
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.
źródło
int.TryParse(m, out int _)
Możesz użyć LINQ w /
int.Parse()
do konwersji nastring[]
,IEnumerable<int>
a następnie przekazać ten wynik doList<T>
konstruktora:źródło
Trochę LINQ przechodzi długą drogę:
źródło
Bez zapytania LINQ możesz wybrać tę metodę,
a następnie możesz przekonwertować tę listę na liczbę całkowitą ...
źródło
.ToList<string>()
nadal potrzebujeusing System.Linq;
źródło
.Select(x => x.Trim()
, ponieważ Parse automatycznie przycina dla Ciebie wszystkie spacje.Jeśli używasz C # 3.5, możesz użyć Linq, aby to osiągnąć
lub krótki
źródło
źródło
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.
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ę.
źródło
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.
Mam nadzieję że to pomoże.
źródło
To proste. Najpierw podziel sznurek. Przytnij puste miejsce po przecinku (,). Następnie użyj zdefiniowanej przez system ToList ()
Aby usunąć spację po „,” i przekonwertować ten tekst rozdzielony przecinkami na List
źródło