ホームページ > バックエンド開発 > C++ > C# でカスタム比較子を使用して文字列をアルファベット順および数値順に並べ替える方法

C# でカスタム比較子を使用して文字列をアルファベット順および数値順に並べ替える方法

Barbara Streisand
リリース: 2025-01-02 13:13:38
オリジナル
380 人が閲覧しました

How to Sort Strings Alphabetically and Numerically Using a Custom Comparer in C#?

カスタム比較を使用して文字列をアルファベット順および数値順に並べ替える

この質問では、数値を考慮しながら文字列数値の配列をアルファベット順に並べ替えるという課題が提示されます。 。これを実現するには、カスタム比較子を実装してデフォルトの文字列比較をオーバーライドする必要があります。

実装の詳細

以下のコードは、この並べ替えを実装する方法を示しています。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート