繁体   English   中英

使用linq分组(范围+计数)

[英]Group by using linq (range + count)

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

var ranges = new[] { 10, 50, 100, 500 };

所需的输出按等于或大于根据类别使用的范围的价格计数分组。 (在一个linq语句中)

cat    range       count
-------------------------------------
1       10           2    (In 1. categories there is 2 item that price >= 10(range) [10;30]) 
2       10           4    (In 2. categories there is 4 item that price >= 10(range) [50;120;200;1024]) 
2       50           4    ....
2      100           3    ....
2      500           1    (In 2. categories there is 1 item that price >= 500(range) [1024]) 

尝试这个:

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

var ranges = new[] { 10, 50, 100, 500 };

var result = from r in ranges
        from g in data
        where g.Price >= r
        select new {g.Cat, Price=r};

var groupedData = 
        from d in result
        group d by new{d.Cat, d.Price} into g
        select new{Cat=g.Key.Cat, Price=g.Key.Price, TotalCount=g.Count()};

这应该工作:

var values =
data.SelectMany(x => ranges.Where(y => x.Price >= y)
                           .Select(y => new { Record = x, Range = y }))
    .GroupBy(x => new { Cat = x.Record.Cat, Range = x.Range })
    .Select(x => new { Cat = x.Key.Cat, Range = x.Key.Range, Count = x.Count()});

结果:

{ Cat = 1, Range = 10,  Count = 2 }
{ Cat = 2, Range = 10,  Count = 4 }
{ Cat = 2, Range = 50,  Count = 4 }
{ Cat = 2, Range = 100, Count = 3 }
{ Cat = 2, Range = 500, Count = 1 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM