Linq groupby返回独特的组

Mar*_*aro 4 c# linq group-by list

我有记录列表,每条记录都有名称轮次. Rounds是由" - "分隔的连接数字

在此输入图像描述

我如何按名称分组并仅显示唯一的回合,也计算回合的数量并显示第一轮和最后一轮

在此输入图像描述

这是我试过的,

 data.GroupBy(d => d.Name)
.Select(
    g => new
    {
        Name = g.Key,
        Rounds = g.Concat(s => s.Rounds),
        NumberOfRounds =  g.Concat(s => s.Rounds).Split('-').Count,
        FirstRound = //??,
        LastRound = //??,
    });
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我将开始通过你的实体投影到一个名称和资源集合的回合对.那将更容易使用.例如:

var query = results
    .Select(d => new { d.Name, Results = d.Rounds.Split('-').Select(int.Parse).ToList() })
    .GroupBy(
        d => d.Name, (key, values) => new {
            Name = key,
            Rounds = values.SelectMany(v => v.Rounds)
                           .Distinct()
                           .OrderBy(x => x)
                           .ToList()
       });
Run Code Online (Sandbox Code Playgroud)

随着作为列表提供的回合,我看不出有什么意义有NumberOfRounds,FirstRoundLastRound作为属性,你可以只使用Rounds.Count,Rounds.First(),Rounds.Last().重要的是尽可能早地将数据转换为更有用的格式.

如果你真的需要在属性中,它很容易投射:

// query as before, but with
.Select(x => new {
    x.Name,
    x.Rounds,
    NumberOfRounds = x.Rounds.Count,
    FirstRound = x.Rounds.First(),
    LastRound = x.Rounds.Last()
});
Run Code Online (Sandbox Code Playgroud)