首页 > 解决方案 > 按三个不同的版本部分分组和排序

问题描述

我有以下数据:

名称 - 市长版本 - 次要版本 - 构建版本
X - 1 - 0 - 0
X - 1 - 1 - 0
X - 2 - 0 - 0
Y - 0 - 2 - 3
Y - 0 - 1 - 1
Z - 4 - 4 - 4

现在我想用 Mayor > Minor > Build 按名称分组来获得最高版本号。

所以这里的输出应该是:
X - 2 - 0 - 0
Y - 0 - 2 - 3
Z - 4 - 4 - 4

如何在linq中做到这一点?我尝试按名称分组,然后按市长排序,然后按次要排序,然后按构建并获取 first(),但我无法弄清楚这里的语法......

标签: c#linq

解决方案


您可以在after 语句中使用OrderByDescendingfollowed with 链式ThenByDescending调用:SelectGroupBy

class Version
{
    public string Name {get;set;} 
    public int MajorVersion {get;set;}
    public int MinorVersion {get;set;}
    public int BuildVersion {get;set;}
}

List<Version> versions = ...;
versions
    .GroupBy(x => x.Name)
    .Select(g => g.OrderByDescending(g => g.MajorVersion)
                    .ThenByDescending(g => g.MinorVersion)
                    .ThenByDescending(g => g.BuildVersion)
                    .First())
    .ToList();

或者尝试利用默认值元组比较器:

versions
    .GroupBy(x => x.Name)
    .Select(g => g.OrderByDescending(g => (g.MajorVersion, g.MinorVersion, g.BuildVersion))
            .First())
    .ToList();

推荐阅读