使用动态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>
现在我的问题是,我如何遍历组,以便我可以访问密钥( Key
在IGrouping
定义IGrouping
但我不知道TKey
和TElement
的先验 )?
我最初试过这个:
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
并获取每row
的Key
,然后遍历每个组中的集合。
问题是您的密钥很short
并且您正在尝试强制转换为密钥为object
的接口。 虽然IGrouping<>
具有协变类型参数,但它只是不起作用,因为方差仅适用于引用类型 。 由于short
是值类型,因此无效。
如果你知道密钥总是short
,你应该这样做。
foreach (IGrouping row in rowGrouped) ...
否则,如果它可能是值类型或引用类型,则可能更容易将整行保持为dynamic
。
foreach (dynamic row in rowGrouped) ...
虽然我个人遇到了麻烦。 也许是一个错误,但运行时无法弄清楚该行在这种情况下具有Key
属性。 我不能告诉你为什么要这么做但记住这一点。