文字列が数値の場合、値を考慮しながら文字列をアルファベット順に並べ替えるにはどうすればよいでしょうか? 質問する

文字列が数値の場合、値を考慮しながら文字列をアルファベット順に並べ替えるにはどうすればよいでしょうか? 質問する

文字列である数値の配列を数値順に並べ替えたいと考えています。

問題は数値をintに変換できません

コードは次のとおりです:

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

編集:出力は090, 101, 102...

コード サンプルを更新して、「things」ではなく「sizes」としました。配列は次のようになります。

string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };

つまり、アルファベット順と番号順に並べ替える必要があります。

007, 90, bob, lauren, paul

ベストアンサー1

カスタム比較子を OrderBy に渡します。列挙可能。順序指定任意の比較演算子を指定できます。

これを実行する方法の 1 つは次のとおりです。

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>
    /// 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);
    }
}

おすすめ記事