Bagaimana saya bisa mengubah string yang dipisahkan koma menjadi Daftar <int>


Jawaban:


433

Inilah salah satu cara melakukannya:

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

11
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.

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
Gagal jika 0 adalah satu input yang sah!
Antoine Meltzheim

2
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 = new List<int>(tags.Split(',').Select(s => int.Parse(s)));

8

LINQ kecil sangat membantu:

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

6

Tanpa LINQ Query, Anda dapat memilih metode ini,

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

dan kemudian Anda dapat mengubah daftar ini menjadi tipe integer ...


hanya sebuah catatan untuk siapa pun yang tidak kenal = .ToList<string>()masih membutuhkanusing System.Linq;
Bill Rawlinson


2

Jika Anda menggunakan C # 3.5 Anda dapat menggunakan Linq untuk mencapai ini

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

atau yang pendek

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

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(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 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.


1

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

Semoga ini membantu.


-2

Itu mudah. Pertama-tama pisahkan string. Potong ruang kosong yang ada setelah koma (,). Kemudian gunakan ToList () yang didefinisikan sistem

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Untuk menghapus spasi setelah ',' dan mengonversi teks yang dipisahkan koma ini ke Daftar

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.