我有一个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。
答案 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)
“此设计使您可以通过应用指定多个排序条件 任意数量的ThenBy或ThenByDescending方法。“
所以你提供的示例代码应该可以工作。在没有指定比较器的情况下,ThenBy使用Default comparator。你确定使用默认的比较器可以对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));
}