Penyusunan Alfanumerik dalam LINQ
Dalam LINQ, kaedah OrderBy mengikut peraturan susunan leksikografi, yang menganggap kedua-dua aksara abjad dan berangka dalam turutan. Walau bagaimanapun, apabila mengisih rentetan yang berakhir dengan nilai angka, susunan ini mungkin tidak menghasilkan hasil yang diingini.
Pertimbangkan contoh berikut:
string[] partNumbers = { "ABC10", "ABC1", "ABC2", "ABC11", "ABC10", "AB1", "AB2", "Ab11" }; var result = partNumbers.OrderBy(x => x);
Hasil sebenar, mengikut susunan leksikografi, akan menjadi:
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
Walau bagaimanapun, hasil yang dijangkakan ialah mengumpulkan urutan abjad yang serupa bersama-sama, tanpa mengira akhiran angka. Untuk mencapai matlamat ini, kita perlu mengubah suai kriteria pesanan.
Kunci untuk mengisih mengikut abjad angka ialah membandingkan bahagian berangka berlapik. Dengan memasukkan sifar kepada nilai berangka, kami memastikan LINQ dapat membezakannya dengan betul. Begini cara kita boleh melakukannya:
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); }
Fungsi ini melapik sifar kepada sebarang nombor dalam rentetan input. Dengan menggunakan fungsi ini sebagai kriteria pesanan dalam LINQ, kami mendapat hasil yang dijangkakan:
var result = partNumbers.OrderBy(x => PadNumbers(x));
Senarai yang terhasil kini akan dipesan sebagai:
AB1 AB2 AB11 ...
Pendekatan ini menganggap bahawa maksimum bilangan digit dalam bahagian berangka diketahui. Untuk kes yang lebih kompleks, pertimbangkan untuk melaksanakan IComparer tersuai, yang membolehkan kawalan yang lebih terperinci ke atas kriteria perbandingan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Susunan Abjad Angka dalam LINQ dengan Sufiks Berangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!