1

我有一个带有对象的 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

4 回答 4

0

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

list = list.OrderBy(x => x.Val3).ThenBy(x => x.Val2 * 10000 + x.Val1).ToList();
于 2012-09-29T14:26:27.303 回答
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 使用默认比较器。您确定 val1 可以使用默认比较器进行排序吗?


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

@Bob Horn 的文档和答案表明您的示例应该有效。您可以添加您订购的对象的更多详细信息吗?

于 2012-09-29T14:47:51.907 回答