【问题标题】:Linq groupby return unique groupLinq groupby 返回唯一组
【发布时间】:2016-08-18 20:19:45
【问题描述】:

我有记录列表,每条记录都有名称回合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 = //??,
    });

【问题讨论】:

  • 使用.SelectMany() 我不在电脑前,否则我会发布答案。

标签: c# linq list group-by


【解决方案1】:

首先,您需要将四舍五入提取为数值。之后就很容易了。

var data = ...;
var groupedData = data
    .GroupBy(x => x.Name)
    .Select(x => new {
        Name = x.Key,
        Rounds = string.Join("-", x.Select(z => z.Rounds))
            .Split('-')
            .Distinct()
            .Select(z => int.Parse(z))
            .OrderBy(z => z)
            .ToArray()
    })
    .Select(x => new {
        x.Name,
        Rounds = string.Join("-", x.Rounds),
        NumberOfRounds = x.Length,
        FirstRound = x.Min(),
        LastRound = x.Max()
    })
    .ToArray();

【讨论】:

  • @juharr 括号在哪里?而.ToArray() 不是string.Join(...) 调用的一部分。
  • 第一个Select 中的xIGrouping,因此它没有Rounds 属性。
  • @Maarten,谢谢回答我的问题!
【解决方案2】:

我会开始将您的实体投影到名称和回合集合对。这将更容易使用。例如:

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()、@ 987654327@。重要的部分是尽早将数据转换为更有用的格式。

如果您真的需要在属性中使用它,那么项目很容易:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2013-08-24
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    相关资源
    最近更新 更多