关于 c#:Group by range using linq | 珊瑚贝

Group by range using linq

本问题已经有最佳答案,请猛点这里访问。


我们如何使用分组范围等于或大于?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var data = new[] {
    new { Id = 0, Price = 2 },
    new { Id = 1, Price = 10 },
    new { Id = 2, Price = 30 },
    new { Id = 3, Price = 50 },
    new { Id = 4, Price = 120 },
    new { Id = 5, Price = 200 },
    new { Id = 6, Price = 1024 },
};

var ranges = new[] { 10, 50, 100, 500 };
var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r > x.Price ) );

grouped ouput is
price 1050 -> 3
price 50100 -> 1
price 100500 -> 2

需要的输出按等于或大于使用的范围分组

1
2
3
4
price >= 10 -> 6
price >= 50 -> 4
price >= 100 -> 3
price >= 500 -> 1
  • 100 -> 2 应该是 100 -> 3,因为您似乎使用了价格等于或大于所用范围的商品计数。 (顺便说一句,您应该尝试澄清您的问题,因为您没有提到某种 COUNT)
  • @Francis P 谢谢..我编辑了我的帖子..我需要确切地计数价格等于或大于使用范围的项目。


1
2
3
var grouped = ranges.Select(r => new {
            Price = r,
            Count = data.Where(x => x.Price >= r).Count() });

还有另一个选择(如果你有大量数据,那么分组比枚举每个价格组的所有数据要好):

1
2
3
4
5
6
7
8
9
var priceGroups = data.GroupBy(x => ranges.FirstOrDefault(r => r > x.Price))
                      .Select(g => new { Price = g.Key, Count = g.Count() })
                      .ToList();

var grouped = ranges.Select(r => new
{
    Price = r,
    Count = priceGroups.Where(g => g.Price > r || g.Price == 0).Sum(g => g.Count)
});

  • 谢谢它解决了我的问题。 @lazyberezovsky
  • @cosmicgate 我在您的问题中看不到任何类别。那是什么?
  • @cosmicgate 抱歉,但新要求使当前答案无效。我认为最好为此创建新问题
  • @cosmicgate 我也可以给你一个从哪里开始的提示 – 我认为你需要组合键来分组 data.GroupBy(x => new { x.cat, price = ranges.FirstOrDefault(r => r > x.Price) })。再次抱歉 – 现在没有空闲时间来进一步调查您的要求。如果您遇到困难,那么只需在 SO 上提出新问题 – 有人会帮助您:)


分组对源进行分区,每个项目分配到一个组。

你所拥有的是一个好的开始:

1
2
3
4
5
6
7
8
9
10
11
12
var data = new[] {
    new { Id = 0, Price = 2 },
    new { Id = 1, Price = 10 },
    new { Id = 2, Price = 30 },
    new { Id = 3, Price = 50 },
    new { Id = 4, Price = 120 },
    new { Id = 5, Price = 200 },
    new { Id = 6, Price = 1024 },
};

var ranges = new[] { 10, 50, 100, 500 };
var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) );

跟进:

1
2
3
4
5
6
7
int soFar = 0;
Dictionary<int, int> counts = grouped.ToDictionary(g => g.Key, g => g.Count());
foreach(int key in counts.Keys.OrderByDescending(i => i))
{
  soFar += counts[key];
  counts[key] = soFar;
}

或者如果你想在一个 linq 语句中做到这一点:

1
2
3
4
5
6
7
8
9
int soFar = 0;
var grouped = data
  .GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) )
  .OrderByDescending(g => g.Key)
  .Select(g =>
  {
    soFar += g.Count();
    return new Tuple<int, int>(g.Key, soFar)
  });

来源:https://www.codenong.com/13828216/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9902.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?