是否可以重新分组使用LINQ GroupBy()的结果?

时间:2010-06-28 14:37:24

标签: c# linq c#-3.0 group-by

如果我使用LINQ的GroupBy()方法创建分组枚举,是否可以在另一个密钥系统下重新组合该结果?也就是说,如果我按属性X对代码的一部分对所有对象进行分组,是否可以随后在代码中的稍后一点按属性X的属性Y对该集合进行分组?

2 个答案:

答案 0 :(得分:4)

我没有看到你的问题,但这有效:

var groupedByProperty1 = myEnumerable.GroupBy(x => x.Property1);

var groupedByProperty2 = groupedByProperty1.SelectMany(g => g)
                                           .GroupBy(x => x.Property2);

这是你正在寻找的任何机会吗?

答案 1 :(得分:0)

这种稍微复杂的方式在某些情况下可能有用:

  • 数据项本身不存在关键“列”
  • 您希望将新密钥直接基于现有的按键分组。

我发现我需要根据一个对Linq-SQL表达式来说过于复杂的额外条件重新组合,这就是我为这种情况提出的方法。

基本上我正在做的是:

  • 将项目列表展平为包含现有密钥+数据项
  • 的新密钥值对列表
  • 根据您的新密钥重新组合 - 直接基于现有密钥

注意:我创建了一个对象DateTime_PaymentStatus来表示密钥。如果您这样做,请确保在课程中添加Equals()方法,否则您将无法进行实际分组!

 // sample to regroup based on modifying an existing key
 var regrouped = grouped. 

                        SelectMany(x => // each x is an individual grouping (Key + List) 

                            // flatten the list, retaining the key each item was grouped by
                            x.Select(y => new 
                            { 
                                Key = x.Key, 
                                Item = y
                            })).

    // regroup based upon the existing key
    GroupBy(x => new DateTime_PaymentStatus 
            { 
                // group based on date + payment status
                Date = x.Key.Date, 
                PaymentStatus = PaidOrUnpaid(x.Key.PaymentStatus)   // call function here that is not SQL compatible
            });