Isih Alfanumerik Menggunakan LINQ
Apabila berurusan dengan rentetan yang termasuk nilai angka, isihan abjad lalai dalam LINQ mungkin tidak menghasilkan hasil yang diingini. Pertimbangkan contoh berikut:
string[] partNumbers = new string[] { "ABC10", "ABC1","ABC2", "ABC11","ABC10", "AB1", "AB2", "Ab11" }; var result = partNumbers.OrderBy(x => x);
Hasil yang dijangkakan akan menyusun rentetan seperti berikut:
AB1 AB2 AB11 ...
Walau bagaimanapun, hasil sebenar berbeza kerana susunan rentetan lalai mengikut susunan leksikografi. Ini bermakna nilai berangka dibandingkan dari kiri ke kanan, membawa kepada susunan berikut:
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
Untuk mencapai pengisihan alfanumerik yang dikehendaki, kita perlu mengubah suai logik perbandingan. Kita boleh meletakkan bahagian berangka setiap rentetan dengan nombor sifar tertentu. Ini memastikan bahawa nilai berangka dibandingkan dengan adil, tanpa mengira panjangnya.
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); } var result = partNumbers.OrderBy(x => PadNumbers(x));
Dengan susunan yang diubah suai ini, bahagian berangka rentetan dibandingkan berdasarkan nilai empuknya, yang membawa kepada susunan yang betul berikut:
AB1 AB2 AB11 ...
Perhatikan bahawa pendekatan ini mengandaikan bilangan digit maksimum untuk nombor dalam input. Jika terdapat nombor dengan lebih banyak digit daripada pelapik yang ditentukan, pengisihan mungkin tidak tepat.
Atas ialah kandungan terperinci Bagaimanakah LINQ Boleh Mencapai Pengisihan Alfanumerik yang Betul bagi Rentetan Yang Mengandungi Nombor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!