Itu juga bisaList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog
2
Apakah ada kebutuhan untuk itu new List<>?
LiquidPony
2
@LiquidPony no; Anda bisa menelepon ToList()sebaliknya; hasilnya pada dasarnya sama: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); Anda perlu melakukan satu atau yang lain, karena nilai kembalinya Select()adalah IEnumerable<>, tetapi bukanList<>
phoog
@LiquidPony dalam implementasi ini ya karena Selectekstensi dalam kasus ini kembali IEnumerable<Int32>dan tidak tercantum. Namun daftar memiliki konstruktor yang menerima koleksi lain sebagai sumber.
Oybek
8
Untuk menangani kasus di mana tag merupakan string kosong, gunakanSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill
25
Jika Anda ingin menyertakan beberapa validasi sederhana dan melewatkan nilai yang tidak valid (alih-alih melemparkan pengecualian), berikut ini sesuatu yang menggunakan 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: Ini adalah permintaan yang diperbarui berdasarkan umpan balik dari Antoine. Itu panggilan TryParse pertama untuk menyaring nilai-nilai buruk, dan kemudian mengurai untuk melakukan konversi yang sebenarnya.
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
Sunting 2: Permintaan yang diperbarui untuk C # 7.0, terima kasih atas umpan balik dari Charles Burns. Perhatikan bahwa kita menyingkirkan variabel mos ekstra dengan pendekatan ini, jadi ini sedikit lebih bersih.
Dengan C # 7.0 Anda dapat menghilangkan deklarasi mos dan mengganti panggilan TryParse denganint.TryParse(m, out int _)
Charles Burns
14
Anda dapat menggunakan LINQ dengan / int.Parse()untuk mengonversikan string[]ke IEnumerable<int>dan kemudian meneruskan hasil itu ke List<T>konstruktor:
var tagIds =newList<int>(tags.Split(',').Select(s =>int.Parse(s)));
Saya membuat modifikasi pada jawaban khalid13. Jika pengguna meletakkan string "0", jawabannya akan menghapusnya dari daftar yang dihasilkan. Saya melakukan sesuatu yang serupa tetapi menggunakan objek anonim.
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 adalah fungsi khusus yang saya buat yang melindungi jika stringnya nol.
Apa yang dilakukan di atas adalah menghapus semua string yang tidak dapat dikonversi tanpa kesalahan. Jika Anda perlu kesalahan jika ada masalah dengan konversi, maka jawaban yang diterima harus melakukan trik.
Saya menemukan ini dan saya hanya ingin berbagi solusi sendiri tanpa LINQ. Ini adalah pendekatan primitif. Nilai-nilai non-integer tidak akan ditambahkan dalam daftar juga.
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);}}
Jawaban:
Inilah salah satu cara melakukannya:
sumber
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?ToList()
sebaliknya; hasilnya pada dasarnya sama:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
Anda perlu melakukan satu atau yang lain, karena nilai kembalinyaSelect()
adalahIEnumerable<>
, tetapi bukanList<>
Select
ekstensi dalam kasus ini kembaliIEnumerable<Int32>
dan tidak tercantum. Namun daftar memiliki konstruktor yang menerima koleksi lain sebagai sumber.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Jika Anda ingin menyertakan beberapa validasi sederhana dan melewatkan nilai yang tidak valid (alih-alih melemparkan pengecualian), berikut ini sesuatu yang menggunakan TryParse:
EDIT: Ini adalah permintaan yang diperbarui berdasarkan umpan balik dari Antoine. Itu panggilan TryParse pertama untuk menyaring nilai-nilai buruk, dan kemudian mengurai untuk melakukan konversi yang sebenarnya.
Sunting 2: Permintaan yang diperbarui untuk C # 7.0, terima kasih atas umpan balik dari Charles Burns. Perhatikan bahwa kita menyingkirkan variabel mos ekstra dengan pendekatan ini, jadi ini sedikit lebih bersih.
sumber
int.TryParse(m, out int _)
Anda dapat menggunakan LINQ dengan /
int.Parse()
untuk mengonversikanstring[]
keIEnumerable<int>
dan kemudian meneruskan hasil itu keList<T>
konstruktor:sumber
LINQ kecil sangat membantu:
sumber
Tanpa LINQ Query, Anda dapat memilih metode ini,
dan kemudian Anda dapat mengubah daftar ini menjadi tipe integer ...
sumber
.ToList<string>()
masih membutuhkanusing System.Linq;
sumber
.Select(x => x.Trim()
, karena Parse secara otomatis memangkas karakter ruang apa pun untuk Anda.Jika Anda menggunakan C # 3.5 Anda dapat menggunakan Linq untuk mencapai ini
atau yang pendek
sumber
sumber
Saya membuat modifikasi pada jawaban khalid13. Jika pengguna meletakkan string "0", jawabannya akan menghapusnya dari daftar yang dihasilkan. Saya melakukan sesuatu yang serupa tetapi menggunakan objek anonim.
TrimNullProtection adalah fungsi khusus yang saya buat yang melindungi jika stringnya nol.
Apa yang dilakukan di atas adalah menghapus semua string yang tidak dapat dikonversi tanpa kesalahan. Jika Anda perlu kesalahan jika ada masalah dengan konversi, maka jawaban yang diterima harus melakukan trik.
sumber
Saya menemukan ini dan saya hanya ingin berbagi solusi sendiri tanpa LINQ. Ini adalah pendekatan primitif. Nilai-nilai non-integer tidak akan ditambahkan dalam daftar juga.
Semoga ini membantu.
sumber
Itu mudah. Pertama-tama pisahkan string. Potong ruang kosong yang ada setelah koma (,). Kemudian gunakan ToList () yang didefinisikan sistem
Untuk menghapus spasi setelah ',' dan mengonversi teks yang dipisahkan koma ini ke Daftar
sumber