【发布时间】:2016-09-21 18:08:51
【问题描述】:
我正在使用 LINQ 对多个字段进行排序。但是如何确定列表中的两个或多个条目是否相等?也就是说,所有字段都是相等的,排序顺序不会因为相等而改变。
public List<SfpDb.ResultatViewRang> sortResMest(List<SfpDb.ResultatViewRang> resultat)
{
return resultat
.OrderBy(p => p.statdsq)
.ThenBy(p => p.statdns)
.ThenBy(p => p.statdnf)
.ThenByDescending(p => p.totsum)
.ThenByDescending(p => p.totOmskyting)
.ThenByDescending(p => p.totinnertreff)
.ThenByDescending(p => p.sumr10)
.ThenByDescending(p => p.sumr9)
.ThenByDescending(p => p.sumr8)
.ThenByDescending(p => p.sumr7)
.ThenByDescending(p => p.sumr6)
.ThenByDescending(p => p.sumr5)
.ThenByDescending(p => p.sumr4)
.ThenByDescending(p => p.sumr3)
.ThenByDescending(p => p.sumr2)
.ThenByDescending(p => p.sumr1)
.ThenBy(p => p.perTreffRangStr)
.ThenBy(p => p.enavn, strCompareNo)
.ThenBy(p => p.fnavn, strCompareNo)
.ToList<SfpDb.ResultatViewRang>();
}
内容来自保存比赛结果的数据库,并根据比赛规则进行排序。排序用于确定竞争对手获得的位置。
根据规则,如果一个或多个竞争对手在比赛中具有相同的值(p.totsum,p.totOmskyting,......),他们将获得相同的位置。例如:
1. 吉姆·哈里斯,580、25、32,......
2. 汤姆·詹森,560、20、30,......
3. 让·约翰逊,523、23、26 岁,......
3. 罗伊·比曼,523、23、26,......
5. 道格·威尔逊,520、23、26,......
排序后的问题是,在这个例子中,我不确定如何识别位置 3 的两个人。
一般来说,具有以下类:
public class MigrObject
{
public int first { get; set; }
public int second { get; set; }
public int third { get; set; }
}
它将使用排序
.OrderByDescending(p => p.first)
.ThenByDescending(p => p.second)
.ThenByDescending(p => p.third)
有以下记录:(第一、第二、第三)
580、25、32
560、30、30
523、23、26
523、23、26
523、23、26
520、23、26
518、40、30
518、40、30
430、14、16
您如何识别相等的记录?处理完记录后,应该有以下仓位/顺序:
1:580、25、32
2:560、30、30
3:523、23、26
3:523、23、26
3:523、23、26
6:520、23、26
7:518、40、30
7:518、40、30
9:430、14、16
根据国际规则,参与者将按照第一个字段(first)中的值进行排序。如果有平局,将比较第二列,所以我们按“第二”排序。如果还有平局,就会比较第三列,所以我们按“第三”排序。如果仍有平局,则运动员必须具有相同的排名,并且必须使用运动员的姓氏按拉丁字母顺序列出。
如果处理后的位置是 1,2,3,3,3,6,7 还是 1,2,3,3,3,4,5 不重要。 主要问题是在比较所有字段后知道是否有任何联系,以及涉及哪些记录。
我希望 LINQ 中有一些功能可以在所有比较字段相等时通知您。
【问题讨论】:
-
你可以使用
Distinct或GroupBy方法。 -
“所有字段都是相等的,排序顺序不会因为相等而改变”——你为什么要关心?你打算如何使用平等?请提供一个很好的minimal reproducible example,清楚地表明您正在尝试做什么。准确而具体地解释该代码的作用以及您希望它做什么。
-
尝试检查stackoverflow.com/q/312024/3956100 我确定您可以更改 linq 中的 IComparer 以满足您的需要。
-
你的问题不清楚。据我所知,您需要做的就是获取
p.totsum, p.totOmskyting, p.totinnertreff的总和并按 desc order 排序。您还可以将 order by 添加到“name”,以显示具有相同标记的人是根据字母顺序排序的。 -
我认为这个问题不正确,因此您希望看到 2 个人在同一位置(在您的示例中为 3 号)。当您查看 LINQ 查询的结果时,可以计算该位置,因此它与 LINQ 查询本身无关。但是,我不明白为什么你在#3 之后的位置是#5,那不应该是#4 吗?