gpt4 book ai didi

c# - Linq OrderBy 属性值和组

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:14 26 4
gpt4 key购买 nike

我基本上有一个表,其中包含我在 C# 中使用 linq 从数据库中读取的表头。在这些 header 中,总是至少有一个始终相同;总计,我希望它始终位于右侧。

下面是我的数据布局方式:

Data
{
Label,
Value,
Age //Not used initially
}

示例数据:

{"Dog", 7}
{"Cat", 3}
{"Other", 4}
{"Total", 14}

我想按此顺序订购标签;实际的动物名称按它们的值降序排列,并将总计附加到末尾:

"Dog", "Other", "Cat", "Total"

我如何在 Linq 中执行此操作。如何根据另一个属性的值对一个属性进行排序?

一旦我有了标题的顺序,是否有一种简单的方法可以根据已经确定的顺序对 future 的行进行排序。如果我想最初找到标题 where(x=>x.Age > 20)如何根据与 >20 集相同的顺序对 where(x=>x.Age <= 20) 中的标签进行排序?

最佳答案

这个查询应该有效:

var query = from row in table
let ignore = row.Label == "Total"
orderby ignore, row.Value descending
select row.Label;

//and corresponding lambda version
var lquery = table.OrderBy(row => row.Label == "Total")
.ThenByDescending(row => row.Value)
.Select(row => row.Label);

注意:并非完全需要创建一个ignore 变量,它可以直接放在orderby 子句中。这样,它使它更具可读性。

不确定你在第二个问题中问的是什么。


编辑:
为了回应您的评论,这将取决于您希望排序如何工作,至少是这样写的。如果您希望完全忽略表中只有一行,则此方法很有效。如果你有不止一个,那就不多了。问题在于,在“忽略”的行中,也将按原始排序进行排序(在本例中,按 Value)。添加另一行的一种天真的方法是添加到忽略条件。

var query = from row in table
let ignore = row.Label == "Total" || row.Label == "Cost"
orderby ignore, row.Value descending
select row.Label;

要在“忽略的”行中进行特定排序,需要稍微复杂一些的查询:

var query = from row in table
let ignore = row.Label == "Total" || row.Label == "Cost"
let ignoreorder = row.Label == "Cost" ? 1 : 0
orderby ignore, ignoreorder, row.Value descending
select row.Label;

//and corresponding lambda version
var lquery = table.OrderBy(row => row.Label == "Total" || row.Label == "Cost")
.ThenBy(row => row.Label == "Cost" ? 1 : 0)
.ThenByDescending(row => row.Value)
.Select(row => row.Label);

关于c# - Linq OrderBy 属性值和组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com