订购列表由3个数字组成

时间:2012-09-29 14:01:03

标签: c# list

我有一个List<>对象,包含多个字段,主要是数字。我想按这些数字中的3个排序这个列表。我试过这个:

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

工作正常,但只适用于前两个订单/ thenbys。第三个似乎根本没有运行。我可以对这两个值的任意组合进行排序,但是第三个值总是被忽略。

我还没有尝试过非LINQ方法,因为我只是好奇这里的问题所在。你不能为3个值排序吗?这有什么问题?如果这有任何影响,3是ushort,而2和1是uint。

4 个答案:

答案 0 :(得分:0)

我不确定是否有更好的解决方案。如果我是你,我会通过乘以一个大值来加权value2。就像:

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

答案 1 :(得分:0)

我想你可以试试这个黑客:

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

答案 2 :(得分:0)

documentation for ThenBy

  

“此设计使您可以通过应用指定多个排序条件   任意数量的ThenBy或ThenByDescending方法。“

所以你提供的示例代码应该可以工作。在没有指定比较器的情况下,ThenBy使用Default comparator。你确定使用默认的比较器可以对val1进行排序吗?


编辑:Doh!刚刚看到“我可以对这两个值的任意组合进行排序,但是第三个值总是被忽略。”所以似乎val1可以通过默认比较器进行排序。

@Bob Horn的文档和答案表明你的例子应该有效。您能否添加您订购的对象的更多细节?

答案 3 :(得分: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));
    }

enter image description here