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();
dasblinkenlight
sumber
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();
khalid13
sumber
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)));
Justin Niessner
sumber
8

LINQ kecil sangat membantu:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
sumber
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 ...


sumber
hanya sebuah catatan untuk siapa pun yang tidak kenal = .ToList<string>()masih membutuhkanusing 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
sumber
2
Menurut docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/… Anda tidak perlu menambahkan .Select(x => x.Trim(), karena Parse secara otomatis memangkas karakter ruang apa pun untuk Anda.
Phillip Quinlan
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();
Agustin Meriles
sumber
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
sumber
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.

SolidSnake4444
sumber
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.

drchanix
sumber
-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();
Parag555
sumber