使用Linq按可变整数范围分组

时间:2009-09-03 21:13:40

标签: c# linq group-by

我正在尝试根据整数范围对一组数据进行分组,但该范围不会以固定的间隔增加。

e.g。我有

物品ID价格
1 10
2 30
3 50
4 120

我想将价格分为0 - 10,11 - 100和100-500。因此,项目1在组A中,项目2,3,在组B中,项目4在组C中。

我最接近的是 从项目 分组项目(items.price / 10)

然后将各个小组加在一起以获得不同的范围。

有什么想法吗?

4 个答案:

答案 0 :(得分:30)

参数化范围上限列表......

var ceilings = new[] { 10, 100, 500 };
var groupings = items.GroupBy(item => ceilings.First(ceiling => ceiling >= item));

答案 1 :(得分:5)

这样的事情怎么样?

var data = new[] {
    new { Id = 1, 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 ) );

答案 2 :(得分:2)

也许像(未经测试):

item.Price <= 10 ? "A" :
     (item.Price <= 100 ? "B" : (item.Price <= 500 ? "C" : "X"))

(并由此分组)

如果这是LINQ-to-Objects,您也可以在静态实用程序函数(GetBand(i)或类似函数)中执行此操作;或者使用LINQ-to-SQL,您可以使用映射到数据上下文的标量UDF执行相同的操作。

答案 3 :(得分:-1)

您可以使用Linq选择不同组中的整数。

类似的东西:

 var newList = theList.Where(i => i < 30 && i >10);

这将从一定的时间间隔内获得所有这些。