是否可以使用 Linq 创建一个组,其中项目属于多个组?
使用以下简单示例:
public class Data
{
public string ID;
public int From;
public int To;
}
还有这个 list :
List<Data> data = new List<Data>()
{
new Data() { ID = "A", From = 1, To = 3 }, // Call this A
new Data() { ID = "B", From = 1, To = 2 }, // Call this B
new Data() { ID = "C", From = 2, To = 3 } // Call this C
};
我想按从和到范围内的每个可能的整数进行分组(尽管我可以为查询提供我想要的范围,例如 1 到 3,而不是找到最小值 + 最大值),并且在每个组中将是一个对分组 int 适合其范围的数据实例的引用。
难以解释,更容易显示每个组以及我期望在每个组中的实例:
[Group 1] 1 - A, B
[Group 2] 2 - A, B, C
[Group 3] 3 - A, C
这可能吗?或者组必须是相互排斥的?
编辑: 是加入方式来做到这一点吗?
int[] range = new int[] { 1, 2, 3 };
var query = from d in data
from r in range
where d.From <= r && d.To >= r
group d by r into g
select g;
如果不首先对范围进行论坛化,这可能吗?
编辑 #2: 使用答案二和重构,您可以执行以下操作:
var result = Enumerable.Range(1,3)
.Select(i => new
{
Key = i,
Values = data.Where(d => i >= d.From &&
i <= d.To)
});
这还有一个额外的好处,即在没有任何适合的 Data 实例的情况下返回范围内的数字,这正是我所需要的。
最佳答案
尝试使用 GroupBy
而不是 Join
。我相信分组是相互排斥的。将所需的“分组”值加入 From <= Value AND To >= Value
上的数据列表
编辑
(回答你的评论)
你可以这样得到你的范围:
int min = data.Min(a => a.From);
int max = data.Max(a => a.To);
List<int> range = new List<int>();
for (int i = min; i <= max; i++)
range.Add(i);
关于c# - Linq - 将项目归入多个组进行分组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2730147/