Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengisih Rentetan Mengikut Abjad dan Numerik Menggunakan Pembanding Tersuai dalam C#?
Mengisih Rentetan Mengikut Abjad dan Numerik dengan Perbandingan Tersuai
Soalan ini memberikan cabaran dalam menyusun tatasusunan nombor rentetan mengikut abjad sambil mempertimbangkan nilai berangkanya . Untuk mencapai matlamat ini, pembanding tersuai mesti dilaksanakan untuk mengatasi perbandingan rentetan lalai.
Butiran Pelaksanaan
Kod di bawah menunjukkan cara melaksanakan pengisihan ini:
using System; using System.Collections.Generic; using System.Linq; namespace StringSort { class Program { static void Main(string[] args) { // Input array of string numbers string[] things = new string[] { "105", "101", "102", "103", "90" }; // Sort using custom comparer IEnumerable<string> sortedThings = things.OrderBy(x => x, new SemiNumericComparer()); // Print sorted array foreach (var thing in sortedThings) { Console.WriteLine(thing); } } public class SemiNumericComparer : IComparer<string> { // Check if a string is numeric public bool IsNumeric(string value) { return int.TryParse(value, out _); } // Compare two strings public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; // Check if both strings are numeric var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { int i1 = Convert.ToInt32(s1); int i2 = Convert.ToInt32(s2); return i1.CompareTo(i2); } // If one string is numeric and the other is not, consider the numeric string greater if (IsNumeric1) return S2GreaterThanS1; if (IsNumeric2) return S1GreaterThanS2; // Otherwise, perform a case-insensitive alphabetical comparison return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } } } }
Logik Pembanding Tersuai
The Kelas SemiNumericComparer mentakrifkan logik perbandingan untuk rentetan. Ia mula-mula menyemak sama ada kedua-dua rentetan adalah berangka menggunakan kaedah IsNumeric. Jika kedua-duanya adalah berangka, ia membandingkannya secara berangka. Jika hanya satu rentetan adalah angka, ia menganggap rentetan angka lebih besar. Untuk rentetan bukan angka, ia melakukan perbandingan abjad tidak peka huruf besar dan kecil.
Apabila menggunakan pembanding ini dengan Enumerable.OrderBy, tatasusunan nombor rentetan akan diisih dahulu mengikut nilai berangka, kemudian mengikut abjad untuk rentetan bukan angka . Output bagi contoh di atas ialah:
90 101 102 103 105
Atas ialah kandungan terperinci Bagaimana Mengisih Rentetan Mengikut Abjad dan Numerik Menggunakan Pembanding Tersuai dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!