使用动态linq分组后访问密钥

使用System.Dynamic.Linq我有一个group by语句,如下所示:

var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c)); 

其中c只是一个字符串数组,我需要在我的分组中选择。 在这种情况下, GroupBy返回一个IEnumerable (注意:不是IEnumerable因为我们不知道T是什么)。 常规GroupBy将返回System.Collections.Generic.IEnumerable<IGrouping>

现在我的问题是,我如何遍历组,以便我可以访问密钥( KeyIGrouping定义IGrouping但我不知道TKeyTElement 的先验 )?

我最初试过这个:

 foreach (var row in rowGrouped) 

哪个迭代,但我无法访问row.Key (在这种情况下的row是类型object

所以我这样做了:

 foreach (IGrouping row in rowGrouped) 

令人惊讶的是,只要钥匙是一根绳子就行了。 但是,如果密钥恰好是数字(例如short ),那么我会收到此错误:

 Unable to cast object of type 'Grouping`2[System.Int16,DynamicClass2]' to type 'System.Linq.IGrouping`2[System.Object,System.Object]'. 

我需要能够遍历rowGrouped并获取每rowKey ,然后遍历每个组中的集合。

问题是您的密钥很short并且您正在尝试强制转换为密钥为object的接口。 虽然IGrouping<>具有协变类型参数,但它只是不起作用,因为方差仅适用于引用类型 。 由于short是值类型,因此无效。

如果你知道密钥总是short ,你应该这样做。

 foreach (IGrouping row in rowGrouped) ... 

否则,如果它可能是值类型或引用类型,则可能更容易将整行保持为dynamic

 foreach (dynamic row in rowGrouped) ... 

虽然我个人遇到了麻烦。 也许是一个错误,但运行时无法弄清楚该行在这种情况下具有Key属性。 我不能告诉你为什么要这么做但记住这一点。