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

标签 c# linq

我正在尝试用 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/

相关文章:

linq - 如何在针对 Entity Framework 的 LINQ 查询中执行 "join"

c# - 正则表达式匹配所有除非?

c# - 在 C# .NET 中的 64 位上运行应用程序时出现奇怪的问题

c# - 自动调用基方法

c# - 应用程序池模式问题 : Classic Or Integrated

.net - 为什么我不能在后代 ("XName"上调用 FirstOrDefault )

c# - ASP.NET : Extended range validation

c# - 使用 LinQ 代码检索 bool 结果

c# - LINQ 从子列表中选择

asp.net - 用于在自连接表中的嵌套 <ul> 中显示无限类别树的逻辑