使用System.Dynamic.Linq我有一个group by语句,如下所示:
var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c));
c
只是一个字符串数组,我需要在分组中选择。在这种情况下,GroupBy
会返回IEnumerable
(注意:不是IEnumerable<T>
,因为我们不知道T
是什么)。常规GroupBy会返回System.Collections.Generic.IEnumerable<IGrouping<TKey, TElement>>
现在我的问题是,我如何遍历这些组,以便我可以访问密钥(Key
已在IGrouping<TKey, TElement>
中定义,但我不知道TKey
和{ {1}} 先验)?
我最初尝试过这个:
TElement
哪次迭代,但我无法访问foreach (var row in rowGrouped)
(在这种情况下row.Key
是row
类型)
所以我这样做了:
object
令人惊讶的是,只要键是一个字符串就行了。但是,如果密钥恰好是数字(例如foreach (IGrouping<object,dynamic> 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
获取Key
,然后遍历每个组中的集合。
答案 0 :(得分:2)
问题是您的密钥是short
,并且您正在尝试转换为密钥为object
的接口。虽然IGrouping<>
具有协变类型参数,但它只是不起作用,因为variance only applies to reference types。由于short
是值类型,因此无效。
如果你知道密钥永远是short
,你应该这样做。
foreach (IGrouping<short, dynamic> row in rowGrouped)
...
否则,如果它可能是值类型或引用类型,则可能更容易将整行保持为dynamic
。
foreach (dynamic row in rowGrouped)
...
虽然我个人遇到了麻烦。也许是一个错误,但运行时无法弄清楚该行在这种情况下具有Key
属性。我不能确切地告诉你为什么要记住这一点。