1

ほとんどが数値である複数のフィールドを保持するオブジェクトを持つ List<> があります。このリストを 3 つの数字で並べ替えたいと思います。私はこれを試しました:

list = list.OrderBy(x => x.Val3).ThenBy(x => x.Val2)
                                .ThenBy(x => x.Val1).ToList();

これは問題なく動作しますが、最初の 2 つの order/thenbys に対してのみです。3番目のものはまったく実行されないようです。これらの値の 2 つの組み合わせは問題なく並べ替えることができますが、3 番目の値は常に無視されます。

ここでの問題がどこにあるのか知りたいだけなので、LINQ 以外のアプローチはまだ試していません。3つの値でソートできませんか? ここで何が問題なのですか?これが何らかの形で問題になる場合、3 は ushort で、2 と 1 は uint です。

4

4 に答える 4

0

これは機能するだけなので、問題は解決しません。しかし、おそらくあなたはあなたのコードをこれと比較して、それがどのように異なるかを見ることができますか?

public class Foo
{
    public string Name { get; set; }
    public uint Val1 { get; set; }
    public uint Val2 { get; set; }
    public ushort Val3 { get; set; }
}

    static void Main(string[] args)
    {
        OrderFoos();

        Console.WriteLine("Press any key to end.");
        Console.ReadKey();
    }

    private static void OrderFoos()
    {
        List<Foo> list = new List<Foo>();
        list.Add(new Foo() { Name = "2nd", Val1 = 2, Val2 = 1, Val3 = 1 });
        list.Add(new Foo() { Name = "1st", Val1 = 1, Val2 = 1, Val3 = 1 });
        list.Add(new Foo() { Name = "3rd", Val1 = 1, Val2 = 2, Val3 = 1 });
        list.Add(new Foo() { Name = "4th", Val1 = 2, Val2 = 1, Val3 = 2 });
        list.Add(new Foo() { Name = "6th", Val1 = 4, Val2 = 1, Val3 = 3 });
        list.Add(new Foo() { Name = "5th", Val1 = 3, Val2 = 1, Val3 = 3 });            

        list = list.OrderBy(x => x.Val3).ThenBy(x => x.Val2).ThenBy(x => x.Val1).ToList();

        list.ForEach(x => Console.WriteLine(x.Name));
    }

ここに画像の説明を入力してください

于 2012-09-29T15:04:15.900 に答える
0

このハックを試すことができると思います:

 list = list.OrderBy(x => x.Val2).OrderBy(x => x.Val3).ThenBy(x => x.Val1).ToList();
于 2012-09-29T14:36:27.913 に答える
0

ThenByのドキュメントには、

「この設計により、任意の数の ThenBy または ThenByDescending メソッドを適用することで、複数の並べ替え基準を指定できます。」

したがって、サンプルコードとして提供するものは機能するはずです。指定されたコンパレータがない場合、ThenBy はDefault コンパレータを使用します。デフォルトのコンパレータを使用して val1 がソート可能であると確信していますか?


編集:おお!「これらの値の 2 つの任意の組み合わせを並べ替えることができますが、3 番目の値は常に無視されます」を見ました。そのため、val1 はデフォルトのコンパレーターでソート可能のようです。

ドキュメントと@Bob Hornからの回答は、あなたの例がうまくいくことを示唆しています。注文しているオブジェクトの詳細を追加できますか?

于 2012-09-29T14:47:51.907 に答える
0

より良い解決策があるかどうかはわかりません。私があなたなら、大きな値を掛けて value2 に重みを付けます。と同じように:

list = list.OrderBy(x => x.Val3).ThenBy(x => x.Val2 * 10000 + x.Val1).ToList();
于 2012-09-29T14:26:27.303 に答える