数値を保持しながら文字列をアルファベット順に並べ替える方法
文字列の一部に数字が含まれている場合、文字列をアルファベット順に並べ替える際に問題が発生する可能性があります。数値変換が禁止されている場合、これらのケースを効果的に処理するには代替アプローチが必要です。
解決策の 1 つは、数値と非数値を区別するカスタム比較子を利用することです。この比較子を OrderBy メソッドに渡して、並べ替え基準をカスタマイズできます。
Enumerable.OrderBy メソッドと SemiNumericComparer クラスを使用した実装例を次に示します。
using System; using System.Collections.Generic; class Program { static void Main() { string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); } } public class SemiNumericComparer: IComparer<string> { /// <summary> /// Determine if a string is a number /// </summary> /// <param name="value">String to test</param> /// <returns>True if numeric</returns> public static bool IsNumeric(string value) { return int.TryParse(value, out _); } /// <inheritdoc /> public int Compare(string s1, string s2) { // Flags to indicate if strings are numeric var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); // Handle numeric comparisons if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); // Order by numerical value if (i1 > i2) { return 1; } if (i1 < i2) { return -1; } return 0; } // Handle cases where only one string is numeric if (IsNumeric1) { return -1; } if (IsNumeric2) { return 1; } // Default to alphabetical comparison return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } } }
このコードは、次のソート順の文字列:
007 90 bob lauren paul 101
以上が数値の順序を維持しながら、数字が埋め込まれた文字列をアルファベット順に並べるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。