使用System.Dynamic.Linq我有一个group by语句,如下所示:
var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c));
Run Code Online (Sandbox Code Playgroud)
哪里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)
Run Code Online (Sandbox Code Playgroud)
哪个迭代,但我无法访问row.Key(row在这种情况下是类型object)
所以我这样做了:
foreach (IGrouping<object,dynamic> row in rowGrouped)
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,只要钥匙是一根绳子就行了.但是,如果密钥恰好是数字(例如short),那么我会收到此错误:
Unable to cast object of type 'Grouping`2[System.Int16,DynamicClass2]' to type
'System.Linq.IGrouping`2[System.Object,System.Object]'.
Run Code Online (Sandbox Code Playgroud)
我需要能够遍历rowGrouped并获取Key每个row,然后遍历每个组中的集合.
问题是您的密钥是 ashort并且您正在尝试转换到密钥是 的接口object。虽然IGrouping<>具有协变类型参数,但它根本不起作用,因为方差仅适用于引用类型。自从short是值类型,因此它不起作用。
如果您知道密钥始终是 a short,则应该将其转换为这样。
foreach (IGrouping<short, dynamic> row in rowGrouped)
...
Run Code Online (Sandbox Code Playgroud)
否则,如果它可能是值类型或引用类型,则将整行保留为dynamic.
foreach (dynamic row in rowGrouped)
...
Run Code Online (Sandbox Code Playgroud)
尽管我个人在这方面遇到了麻烦。也许是一个错误,但运行时无法确定该行在Key这种情况下具有属性。我无法确切地告诉你为什么,但请记住这一点。