嗯,你当然可以express在 LINQ 中轻松实现:
var x = from value in values
group value by ranges.Where(x => value >= x)
.DefaultIfEmpty()
.Last();
但我非常怀疑这在 LINQ to SQL 中是否有效。基本上,您必须找到一种将值映射到其中一个类别的简单方法。
完整示例:
using System;
using System.Linq;
using System.Collections.Generic;
class Test
{
static void Main()
{
int[] values = {100, 110, 120, 130, 140, 150, 160, 170};
int[] ranges = {115, 145, 180};
var query = from value in values
group value by ranges.Where(x => value >= x)
.DefaultIfEmpty()
.Last();
foreach (var group in query)
{
Console.WriteLine("{0}: {{{1}}}", group.Key,
string.Join(", ", group));
}
}
}
Output:
0: {100, 110}
115: {120, 130, 140}
145: {150, 160, 170}
请注意,这won't包括任何没有任何值的类别。
另请注意,这会更简单(使用First()
代替Last()
)如果您愿意稍微不同地进行分类:
115: {100, 110}
145: {120, 130, 140}
180: {150, 160, 170}
换句话说,如果类别是由第一个范围值定义的higher比行值。
编辑:这是一个提供空组的版本。但在我看来,这非常可怕:
var query = from range in ranges
join value in values
on range equals ranges.Where(x => value >= x)
.DefaultIfEmpty()
.Last() into groups
select new { Key = range, Values = groups};
foreach (var group in query)
{
Console.WriteLine("{0}: {{{1}}}", group.Key,
string.Join(", ", group.Values));
}