gpt4 book ai didi

c# - 在 C# 中使用 LINQ 在范围之间分组数据

转载 作者:行者123 更新时间:2023-11-30 15:59:01 24 4
gpt4 key购买 nike

我编写了以下代码来创建两个数字之间的范围,数据分为 7 列:

  private List<double> GetRangeForElements(double minPrice, double maxPrice)
{
double determineRange = Math.Round(maxPrice / 7.00d, 3);
var ranges = new List<double>();
ranges.Insert(0, Math.Round(minPrice, 3));
ranges.Insert(1, determineRange);
for (int i = 2; i < 8; i++)
{
ranges.Insert(i, Math.Round(determineRange * i, 3));
}
return ranges;
}

现在我在调用方法时有了范围列表:

var ranges = GetRangeForElements(1,1500);

另一方面,现在我有包含以下数据(属性)的数据(列表):

public double TransactionPrice {get;set;}

public int SaleAmount {get;set;}

输入数据为:

Transaction price    Sale amount

114.5 4
331.5 6
169.59 8
695.99 14
1222.56 5

1 到 1500 之间的生成范围是:

1
214.28
428.57
642.85
857.14
1071.43
1285.71
1500.00

所需的输出将是:

Range                    Sales
(1 - 214.28) 12
(214.28 - 428.57) 6
(428.57 - 642.85) 0
(642.85 - 857.14) 14
(857.14 - 1071.43) 0
(1071.43 - 1285.71) 5
(1285.71 - 1500) 0

我试过这样的:

var priceGroups = _groupedItems.GroupBy(x => ranges.FirstOrDefault(r => r > x.TransactionPrice))
.Select(g => new { Price = g.Key, Sales = g.Sum(x=>x.Sales) })
.ToList();

但这并没有给我我想要的,我收到的结果完全乱七八糟(我能够手动验证数据和结果)...

有人可以帮帮我吗?

附言伙计们,没有销售额的范围应该简单地将值设置为 0...

@blinkenknight 这是我所说的图片,最低价格 = 2.45,最高价格 = 2.45

您发布的第二种方法的输出是:

enter image description here

最佳答案

GetRangeForElements返回 List<double> , 你不能按它分组。但是,您可以按范围 索引 分组,然后使用该索引取回范围:

var rangePairs = ranges.Select((r,i) => new {Range = r, Index = i}).ToList();
var priceGroups = _groupedItems
.GroupBy(x => rangePairs.FirstOrDefault(r => r.Range >= x.TransactionPrice)?.Index ?? -1)
.Select(g => new { Price = g.Key >= 0 ? rangePairs[g.Key].Range : g.Max(x => x.TransactionPrice), Sales = g.Sum(x=>x.Sales) })
.ToList();

假设_groupedItems是一个列表,你也可以从范围开始,直接产生结果:

var priceGroups = ranges.Select(r => new {
Price = r
, Sales = _groupedItems.Where(x=>ranges.FirstOrDefault(y=>y >= x.TransactionPrice) == r).Sum(x => x.Sales)
});

注意:很有可能,您的 GetRangeForElements有一个错误:它假定 minPricemaxPrice / 7.00d 相比相对较小.要查看此问题,请考虑如果通过 minPrice=630 会发生什么情况和 maxPrice=700 : 你会得到 630, 100, 200, 300, ...而不是 630, 640, 650, ... .要解决此问题,请计算 (maxPrice - minPrice) / 7.00d并将其用作从 minPrice 开始的步骤:

 private List<double> GetRangeForElements(double minPrice, double maxPrice) {
double step = (maxPrice - minPrice) / 7.0;
return Enumerable.Range(0, 8).Select(i => minPrice + i*step).ToList();
}

关于c# - 在 C# 中使用 LINQ 在范围之间分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42421276/

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