文字列配列内の数値に優先順位を付けながらアルファベット順を維持する
文字列をアルファベット順に並べ替えるのは標準的なタスクですが、文字列が数値の順序を維持したまま数値も表現できますか?この課題に対処するソリューションを次に示します。
次のコードを考えてみましょう:
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
期待を達成するには出力:
90, 101, 102, 103, 105
カスタム比較子を OrderBy に渡す必要があります。 Enumerable.OrderBy を使用すると、並べ替え用のカスタム比較子を指定できます。
次に、SemiNumericComparer を使用した実装を示します。
string[] things = new string[] { "paul", "bob", "lauren", "007", "90" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
SemiNumericComparer クラスは、文字列が数値かどうかを判断するメソッドを定義し、次の機能を提供します。比較メソッド:
public class SemiNumericComparer: IComparer<string> { /// <summary> /// Method to 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) { 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); } }
の配列に適用した場合文字列の場合、SemiNumericComparer は文字列を最初にアルファベット順に並べ替え、次に数値順に並べ替えて、目的の出力を提供します。
以上が数値を優先しながら文字列配列をアルファベット順に並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。