gpt4 book ai didi

c# - 按范围对数据进行分组以制作直方图

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:15 24 4
gpt4 key购买 nike

我正在尝试用 C# 制作生命周期值(value)直方图。

我想将数据分组到 10 美元的桶中。我正在尝试找到一种无需显式定义每个存储桶的方法。

输出应该是这样的:

Range : Count  
0-10 : 23
10-20 : 40
20-30 : 43

等...

我还有一张成员(member)表;假设他有两个字段。

int Id
Decimal LifeTimeValue

有没有一种方法可以在 LINQ 中执行此操作而不需要我显式定义每个存储桶?

这是到目前为止我在 SQL 中所做的。我可以轻松地将其移植到 LINQ 中,但这是一种糟糕的方法,因为我必须为每个存储桶复制一个 when 子句。

select
case when LifeTimeValue >= 0 and LifeTimeValue < 10 then ' 0 - 10'
when LifeTimeValue > 10 and LifeTimeValue <= 20 then ' 10+ - 20'
when LifeTimeValue > 20 and LifeTimeValue <= 30 then ' 20+ - 30'
else 'over 30'
end As PriceRange,
count(LifeTimeValue) as ItemTotal
from tblMember
group by
case when LifeTimeValue >= 0 and LifeTimeValue < 10 then ' 0 - 10'
when LifeTimeValue > 10 and LifeTimeValue <= 20 then ' 10+ - 20'
when LifeTimeValue > 20 and LifeTimeValue <= 30 then ' 20+ - 30'
else 'over 30'
end;

最佳答案

在创建直方图时,重要的是要涵盖桶可能没有数据的情况。桶的 0 结果很重要。

按桶顺序提供数据也可能是明智的。

首先进行查找:

var lookup = context.Member.ToLookup(x => (int)x.LifeTimeValue / 10);

更改为 int 允许整数除以生成桶。

现在我们需要找到数据的范围:

var smallest = lookup.Min(x => x.Key);
var largest = lookup.Max(x => x.Key);

现在查询很简单了:

var query =
from x in Enumerable
.Range(smallest, largest - smallest + 1)
select new
{
Range = String.Format("{0}-{1}", x * 10, (x + 1) * 10),
Count = lookup[x].Count(),
};

这是我创建的一些示例数据的结果:

histogram data

请注意,范围 10-20 的计数为 0

关于c# - 按范围对数据进行分组以制作直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27158621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com