文字列を英数字順に並べ替える
プログラミングでは、多くの場合、特定の基準に基づいてデータを並べ替える必要があります。一般的なシナリオの 1 つは、アルファベットと数字の両方を含む文字列を並べ替えることです。ただし、このような文字列をデフォルトの順序で単純に並べ替えても、望ましい結果が得られない可能性があります。
次のコード スニペットを考えてみましょう。
string[] things = new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
このコードは、文字列の配列を数値的に並べ替えることを目的としていますが、得られた出力は不正です:
101, 102, 103, 105, 90
数値に基づいて文字列を並べ替える代わりに
数値文字列を処理するためのカスタム比較子
この問題に対処するには、次のようにします。アルファベット文字列と数値文字列の両方を処理できるカスタム比較子を定義できます。アイデアは、Enumerable.OrderBy を使用することです。これにより、並べ替え動作を制御するカスタム コンペアラーを指定できるようになります。
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 _); } }
この比較子は、両方の文字列が数値であるかどうかを確認し、それに応じて並べ替えます。 1 つの文字列のみが数値の場合は、アルファベットの文字列が優先されます。
カスタム比較子を使用するには、コードを次のように変更できます。
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
これで、出力は正しく並べ替えられます。アルファベット順と数値順の両方:
007, 90, bob, lauren, paul
カスタム比較子を使用すると、以下を含む文字列を効果的に並べ替えることができます。数値を整数に変換する必要がなく、最初の課題に対処し、望ましい並べ替え動作を実現します。
以上がC# で英数字の文字列を正しく並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。