我正在尝试用 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(),
};
这是我创建的一些示例数据的结果:
请注意,范围 10-20
的计数为 0
。
关于c# - 按范围对数据进行分组以制作直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27158621/