Linq groupby返回独特的组

时间:2016-04-25 12:29:49

标签: c# linq list group-by

我有记录列表,每条记录都有名称轮次轮次是由“ - ”

分隔的连接数字

enter image description here

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

enter image description here

这是我试过的,

 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 = //??,
    });

2 个答案:

答案 0 :(得分: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()
       });

将这些轮次作为列表提供,我不会发现将NumberOfRoundsFirstRoundLastRound作为属性的重点在于可以使用Rounds.CountRounds.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()
});

答案 1 :(得分:1)

首先,您需要将轮次提取为数值。在那之后,很容易。

book title is jack;
----------------------------------
book writer is tom;