使用动态 linq 分组后的访问密钥
本文关键字:访问 密钥 动态 linq | 更新日期: 2023-09-27 18:24:10
Using 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
和先验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
并获取每个row
的Key
,然后循环访问每个组中的集合。
问题是您的密钥是short
,并且您正在尝试转换为密钥object
的接口。 虽然IGrouping<>
具有协变类型参数,但它根本不起作用,因为方差仅适用于引用类型。 由于short
是值类型,因此它不起作用。
如果你知道密钥将永远是一个short
,你应该这样投射它。
foreach (IGrouping<short, dynamic> row in rowGrouped)
...
否则,如果它可以是值类型或引用类型,则可能更容易将整行保留为 dynamic
。
foreach (dynamic row in rowGrouped)
...
虽然我个人对此有过麻烦。也许是一个错误,但在这种情况下,运行时无法确定该行是否具有Key
属性。我不能确切地告诉你为什么,但请记住这一点。