gpt4 book ai didi

linq - 您可以创建基于范围的分组吗?

转载 作者:行者123 更新时间:2023-12-04 06:49:29 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Group by variable integer range using Linq

(4 个回答)


4年前关闭。




这与Another Question有关,我认为这确实解决了一个更简单的问题,所以我在这里提出更简单的问题,希望它能帮助我解决更复杂的问题。

我希望能够在 linq to sql 查询中创建一个分组,该分组基于另一组数据中的一系列数据。但是,我认为它应该在 linq to objects 中也能正常工作,所以让我们继续吧。

想象一下你有两个包含值的列表

{100, 110, 120, 130, 140, 150, 160, 170}
{115, 145, 180}

现在,我想将第一个列表按第二个分组为范围(每个组之间的值)。也就是说,我想要这样的分组(隐含 0):
{0}   {100, 110}
{115} {120, 130, 140}
{145} {150, 160, 170}
{180}

我几乎可以肯定我误用了术语,并且可能对 linq group by operator 的工作方式有误解,但如果你明白我的意思,我希望得到一些建议。谢谢。

最佳答案

好吧,您当然可以轻松地在 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));
}
}
}

输出:
0: {100, 110}
115: {120, 130, 140}
145: {150, 160, 170}

请注意,这不会包括任何没有任何值的类别。

另请注意,如果您愿意稍微不同地分类,这会更简单(使用 First() 而不是 Last() ):
115: {100, 110}
145: {120, 130, 140}
180: {150, 160, 170}

换句话说,如果类别是由高于行值的第一个范围值定义的。

编辑:这是一个提供空组的版本。不过,这很可怕,IMO:
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));
}

关于linq - 您可以创建基于范围的分组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332566/

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