是否可以使用Linq创建一个项目,其中项目属于多个组?
使用以下简单示例:
public class Data
{
public string ID;
public int From;
public int To;
}
这个清单:
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
};
我想按照From和To范围内的每个可能的整数进行分组(尽管不是找到min + max而是我可以提供我想要的范围的查询,例如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)
});
这样做的另一个好处是也可以返回范围内的数字,而不需要任何适合的数据实例,这就是我需要的。
答案 0 :(得分:2)
而不是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);
答案 1 :(得分:1)
GroupBy
对项目进行分组,使得任何项目都不在一个组中。
这应该做你想要的:
var result = data.SelectMany(d => Enumerable.Range(d.From, d.To - d.From + 1))
.Distinct()
.Select(i => new
{
Key = i,
Values = data.Where(d => i >= d.From &&
i <= d.To)
});
我不知道这是否比你已有的解决方案有了很大改进。