Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengisih Rentetan Alfanumerik dengan Betul dalam C#?
Mengisih Rentetan Secara Alfanumerik
Dalam pengaturcaraan, selalunya perlu mengisih data berdasarkan kriteria tertentu. Satu senario biasa ialah menyusun rentetan yang mungkin mengandungi kedua-dua aksara abjad dan angka. Walau bagaimanapun, mengisih rentetan sedemikian secara naif menggunakan susunan lalai mungkin tidak menghasilkan hasil yang diingini.
Pertimbangkan coretan kod berikut:
string[] things = new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
Kod ini bertujuan untuk mengisih tatasusunan rentetan secara berangka,但得到的输出却是不正确的:
101, 102, 103, 105, 90
Daripada mengisih rentetan berdasarkan nilai berangkanya, susunan lalai menganggapnya sebagai rentetan dan mengisih mengikut abjad, menghasilkan output di atas.
Pembanding Tersuai untuk Dikendali Rentetan Berangka
Untuk menangani isu ini, kami boleh menentukan pembanding tersuai yang boleh mengendalikan rentetan abjad dan berangka. Ideanya ialah menggunakan Enumerable.OrderBy, yang membolehkan kami menentukan pembanding tersuai untuk mengawal gelagat pengisihan.
Berikut ialah cara kami boleh melaksanakan pembanding tersuai menggunakan IComparer
public class SemiNumericComparer : IComparer<string> { public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); if (i1 > i2) { return S1GreaterThanS2; } if (i1 < i2) { return S2GreaterThanS1; } return 0; } if (IsNumeric1) { return S2GreaterThanS1; } if (IsNumeric2) { return S1GreaterThanS2; } return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } public static bool IsNumeric(string value) { return int.TryParse(value, out _); } }
Pembanding ini menyemak sama ada kedua-dua rentetan adalah angka dan mengisihnya dengan sewajarnya. Jika hanya satu rentetan adalah berangka, ia mengutamakan rentetan abjad.
Untuk menggunakan pembanding tersuai, kita boleh mengubah suai kod seperti berikut:
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
Kini, output akan diisih dengan betul mengikut abjad dan berangka:
007, 90, bob, lauren, paul
Dengan menggunakan pembanding tersuai, kami boleh mengisih rentetan yang mengandungi dengan berkesan aksara berangka tanpa perlu menukarnya kepada integer, menangani cabaran awal dan mencapai gelagat pengisihan yang diingini.
Atas ialah kandungan terperinci Bagaimana Mengisih Rentetan Alfanumerik dengan Betul dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!