【发布时间】:2021-01-14 00:28:54
【问题描述】:
请考虑这个列表:
List<Data> lst = new List<Data>
{
new Data() { Id = 1, Val1 = 100 },
new Data() { Id = 1, Val1 = 200 },
new Data() { Id = 1, Val1 = 300 },
new Data() { Id = 2, Val1 = 100 },
new Data() { Id = 2, Val1 = 200 },
new Data() { Id = 3, Val1 = 300 },
new Data() { Id = 3, Val1 = 300 },
new Data() { Id = 3, Val1 = 300 },
new Data() { Id = 1, Val1 = 200 },
new Data() { Id = 1, Val1 = 200 },
new Data() { Id = 1, Val1 = 200 },
new Data() { Id = 2, Val1 = 200 },
new Data() { Id = 3, Val1 = 100 },
new Data() { Id = 3, Val1 = 100 },
};
然后是这段代码:
decimal Cumulative_Probability = 0;
var Result1 = (lst.OrderBy(o => o.Id).GroupBy(x => new { x.Val1 })
.Select(y => new
{
y.Key.Val1,
Probability = (Convert.ToDecimal(y.Count()) / lst.Count),
Cumulative_Probability = (Cumulative_Probability =
Cumulative_Probability +
(Convert.ToDecimal(y.Count()) / lst.Count))
})).OrderBy(o => o.Val1).ToList();
此代码运行良好,Cumulative_Probability 计算正确。
现在请考虑以下代码:
decimal Cumulative_Probability2 = 0;
var Result2 = (lst.OrderBy(o => o.Id).GroupBy(x => new { x.Id, x.Val1 })
.Select(y => new
{
y.Key.Id,
y.Key.Val1,
Probability = (Convert.ToDecimal(y.Count())
/ lst.Where(o => o.Id == y.Key.Id).Count()),
Cumulative_Probability = (Cumulative_Probability2 =
Cumulative_Probability2 +
(Convert.ToDecimal(y.Count()) /
lst.Where(o => o.Id == y.Key.Id).Count()))
})).OrderBy(o => o.Id).ThenBy(o => o.Val1).ToList();
这段代码生成这个结果:
如您所见,Probability 在每个组中都正确计算,但不是Cumulative_Probability。我想在每个 Id 组中计算Cumulative_Probability(组记录首先根据Id 然后Val1)并且Cumulative_Probability2 不会在每个组中重置。我如何计算每个组中的Cumulative_Probability?
谢谢
编辑 1)
我想要这个结果:
Id Val1 Probability Cumulative_Probability
-------------------------------------------------------------------------
1 100 0.16 0.16
1 200 0.66 0.82
1 300 0.16 0.98
2 100 0.33 0.33
2 200 0.66 0.66
...
【问题讨论】:
-
你能说明你的预期输出是什么吗?
-
我现在明白了,您只需要该 ID 的累积值
-
您想要每个 ID 的先前值的总和。所以你想要 Probability.Select((x, i) => x.Take(i + 1).Sum())
-
@jdweng 你认为
Ids 是1,2,3,...但在现实世界中我有Ids 就像1401, 2012, 3232, ...一样 -
A GroupBy 创建一个二维数组
> : Probability.GroupBy(x => x.Id).Select(x => x.Select((y,i) => new {id = x.Key, p = y, c= x.Take(i + 1).Sum()})).ToList();
标签: c# linq c#-4.0 lambda group-by