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)));