Isih abjad angka dengan LINQ
Mengisih rentetan abjad angka, di mana setiap elemen berakhir dengan nilai berangka, boleh mencabar dengan mekanisme pengisihan lalai LINQ. Masalah timbul apabila bergantung semata-mata pada susunan abjad, mengakibatkan output pengisihan yang tidak dijangka.
Pertimbangkan tatasusunan rentetan berikut:
string[] partNumbers = new string[] { "ABC10", "ABC1", "ABC2", "ABC11", "ABC10", "AB1", "AB2", "Ab11" };
Menggunakan kaedah OrderBy LINQ secara langsung akan menghasilkan output disusun berikut:
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
Hasil ini menyimpang daripada jangkaan yang diingini kerana nilai berangka pada penghujungnya tidak diambil kira dengan betul.
Penyelesaian
Untuk mencapai pengisihan yang dimaksudkan, bahagian berangka rentetan perlu dipadatkan dalam kunci pengisihan. Ini boleh dicapai dengan kaedah tersuai, seperti PadNumbers, yang ditakrifkan seperti berikut:
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); }
Kaedah ini menggantikan sebarang jujukan berangka dalam rentetan input dengan setara dengan empuknya. Dengan menggunakan kaedah ini dalam klausa OrderBy, bahagian berangka dinormalisasi dengan berkesan untuk perbandingan:
var result = partNumbers.OrderBy(x => PadNumbers(x));
Pendekatan ini memastikan bahawa nilai berangka dilayan secara sama rata, tanpa mengira panjangnya, menghasilkan pengisihan abjad angka yang diingini:
AB1 AB2 AB11 ...
Walaupun penyelesaian ini mengandaikan bilangan digit maksimum untuk nombor, ia menyediakan kaedah yang mantap untuk pengisihan alfanumerik menggunakan LINQ.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengisih Rentetan Abjad Angka dengan Imbuhan Berangka Dengan Betul Menggunakan LINQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!