C# LINQ:具有布尔值的嵌套排序/排序

C# LINQ:具有布尔值的嵌套排序/排序,c#,linq,sorting,C#,Linq,Sorting,鉴于以下情况: public class Data { public bool Value1 { get; set; } public bool Value2 { get; set; } public int Value3 { get; set; } } var list = new List<Data> { new Data { Value1 = true, Value2 = false, Value3 = 5}, // d1 new Da

鉴于以下情况:

public class Data {
    public bool Value1 { get; set; }
    public bool Value2 { get; set; }
    public int Value3 { get; set; }
}

var list = new List<Data> {
    new Data { Value1 = true, Value2 = false, Value3 = 5}, // d1
    new Data { Value1 = true, Value2 = true, Value3 = 10}, // d2
    new Data { Value1 = false, Value2 = false, Value3 = 20}, // d3
    new Data { Value1 = false, Value2 = true, Value3 = 30}, // d4
    new Data { Value1 = false, Value2 = false, Value3 = 15} // d5
};

var orderedList = list.OrderByDescending(d => d.Value1).ThenByDescending(d => d.Value2).ThenBy(d => d.Value3);
我希望达到的目标是:d1-d2-d4-d5-d3

orderedList中的实际结果是:d2-d1-d4-d5-d3

这是因为在d2上,Value2和Value1是真的,所以它可能是有意义的。尽管如此,我并不关心Value1和Value2在这个用例中是否都是真的。我想实现我所拥有的

首先,Value1为true的所有对象,在按排序的对象中 价值3 第二,在这些对象中,Value2为true的所有对象 按价值排序3 最后,剩下的按Value3排序 有没有可能做到这一点?

您可以尝试以下方法

根据注释更新代码

var orderedVal1 = list.Where(item=>item.Value1==true).OrderBy(d => d.Value3);
var orderedVal2 = list.Where(item=>item.Value1==false && item.Value2==true).OrderBy(d => d.Value3);
var orderedVal3 = list.Where(item=>item.Value1==false && item.Value2 ==false).OrderBy(d => d.Value3);

var orderedList = orederedval1.Concat(orderedVal2).Concat(orderedVal3);

在第二个表达式中,我使用Value1和Value2的组合。如果Value1为true,则无论Value2如何,结果都将始终为true,从而“跳过”结果排序。如果Value1为false,则仅取决于Value2。

下面的代码可能会帮助您开始。您有三条规则,编码在代码的前三行

var firstBit = list.Where(z => z.Value1).OrderBy(z => z.Value3);
var secondBit = list.Where(z => !z.Value1 && z.Value2).OrderBy(z => z.Value3);
var last = list.Where(z => !z.Value1 && !z.Value2).OrderBy(z => z.Value3);

var final = firstBit.Concat(secondBit).Concat(last);

Console.WriteLine(string.Join(",", final.Select(z => z.Value3)));

一切皆有可能,试图理解这个问题被证明是一个问题。我们是否应该更改orderedVal3以检查value1和value2是否都为假?@Zulatin-更新了代码。此外,对于OrdEdval2,应该只考虑Value1和false。Else将为val1和val2创建具有true的副本。使用多个列表和Concat是一种糟糕的方法。因为mjwills的答案从纯功能的角度来看也是有效的,所以顺便说一句,这也有效-然而@STDMP的解决方案更简单,因为Meth这个答案可以通过解释来完成,因此它是清晰和有效的简洁明了。@Digitalsa1nt不是真的。虽然它很简单,但我对它的作用做了一些解释。谢谢,它只是提高了你答案的质量,像这样的好答案值得付出额外的努力。
var firstBit = list.Where(z => z.Value1).OrderBy(z => z.Value3);
var secondBit = list.Where(z => !z.Value1 && z.Value2).OrderBy(z => z.Value3);
var last = list.Where(z => !z.Value1 && !z.Value2).OrderBy(z => z.Value3);

var final = firstBit.Concat(secondBit).Concat(last);

Console.WriteLine(string.Join(",", final.Select(z => z.Value3)));