1

私はこれに関する多くの投稿を見つけましたが、それらを私の場合と一致させることができませんでした。

リストにいくつかの文字列があります

List<string> list = new List<string>{ "100-1", "100-11", "100-3", "100-20" }

次のコードを使用して、この場所から選択されたものを並べ替えました

void Main()
{
    string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };

    foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
    {    
        Console.WriteLine(thing);
    }
}

public class SemiNumericComparer: IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        if (IsNumeric(s1) && IsNumeric(s2))
        {
            if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
            if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
            if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
        }

        if (IsNumeric(s1) && !IsNumeric(s2))
            return -1;

        if (!IsNumeric(s1) && IsNumeric(s2))
            return 1;

        return string.Compare(s1, s2, true);
    }

    public static bool IsNumeric(object value)
    {
        try {
            int i = Convert.ToInt32(value.ToString());
            return true; 
        }
        catch (FormatException) {
            return false;
        }
    }
}

私の出力は100-1, 100-11, 100-20, 100-3

値をとっ-decimal比較していると思います。実際、私は結果がになることを期待していました 100-1, 100-3, 100-11, 100-20。実際にソートを実行している基準を知りたかっただけです。どんな助けでも大歓迎です。100-2私でさえ、それが異なって扱われることを期待してい100-20ます。

その場で、Infragisticコントロールグリッドで、ソートすると、ここで期待していたのと同じ結果が得られることを確認しました。

編集

リストには他にも多くの文字列値があり、整数や倍精度浮動小数点数などもあります。ハイフンはここで言及されている単なる事例です。

4

3 に答える 3

4
var sorted = things.Select(s => s.Split('-'))
                .OrderBy(x => double.Parse(x[0]))
                .ThenBy(x => double.Parse(x[1]))
                .Select(x=>String.Join("-",x))
                .ToList();
于 2012-12-03T09:20:07.193 に答える
2

これは期待どおりに動作するはずです:

string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
IEnumerable<string> ordered = things
            .Select(s => new
            {
                str = s,
                firstPart = s.Split('-').ElementAtOrDefault(0),
                secondPart = s.Split('-').ElementAtOrDefault(1)
            })
            .OrderBy(x => int.Parse(x.firstPart))
            .ThenBy(x => int.Parse(x.firstPart))
            .Select(x => x.str);

foreach (string s in ordered)
    Console.WriteLine(s);

データが厳密であると想定していますが、それ以外の場合は例外が発生します。fe at int.Parse(x.firstPart).

デモ: http://ideone.com/UJ5Yt4

于 2012-12-03T09:21:07.427 に答える
1

2 番目の数字 (ハイフンの後) でアイテムを並べ替える場合は、文字列を解析して数字にし、それを使用して並べ替える必要があります。あなたが試すことができます:

string[] things = new string[] { "100-1", "100-11", "100-3", "100-20" };
var test = things.OrderBy(r => int.Parse(r.Split('-')[1])).ToArray();

現在のコードが機能していない理由は、おそらく文字列100-を整数値に解析できず、関数IsNumericが false を返しているためです。

于 2012-12-03T09:16:44.967 に答える