我有记录列表,每条记录都有名称和轮次。 轮次是由“ - ”
分隔的连接数字我如何按名称分组并仅显示唯一的回合,也计算回合的数量并显示第一轮和最后一轮
这是我试过的,
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 = //??,
});
答案 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()
});
将这些轮次作为列表提供,我不会发现将NumberOfRounds
,FirstRound
和LastRound
作为属性的重点在于可以使用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()
});
答案 1 :(得分:1)
首先,您需要将轮次提取为数值。在那之后,很容易。
book title is jack;
----------------------------------
book writer is tom;