Linq - 分组项目属于多个组?

时间:2010-04-28 14:03:43

标签: c# linq

是否可以使用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)
                                      });

这样做的另一个好处是也可以返回范围内的数字,而不需要任何适合的数据实例,这就是我需要的。

2 个答案:

答案 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)
                              });

我不知道这是否比你已有的解决方案有了很大改进。