カスタム比較を使用して文字列をアルファベット順および数値順に並べ替える
この質問では、数値を考慮しながら文字列数値の配列をアルファベット順に並べ替えるという課題が提示されます。 。これを実現するには、カスタム比較子を実装してデフォルトの文字列比較をオーバーライドする必要があります。
実装の詳細
以下のコードは、この並べ替えを実装する方法を示しています。
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); } } } }
カスタム比較子Logic
SemiNumericComparer クラスは、文字列の比較ロジックを定義します。まず、IsNumeric メソッドを使用して、両方の文字列が数値であるかどうかを確認します。両方が数値の場合、数値的に比較されます。 1 つの文字列のみが数値の場合、数値文字列のほうが大きいとみなされます。数値以外の文字列の場合、大文字と小文字を区別しないアルファベット比較が実行されます。
この比較子を Enumerable.OrderBy で使用すると、文字列数値の配列は最初に数値で並べ替えられ、次に非数値文字列についてはアルファベット順に並べ替えられます。 。上記の例の出力は次のようになります:
90 101 102 103 105
以上がC# でカスタム比較子を使用して文字列をアルファベット順および数値順に並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。