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

时间:2014-09-24 15:56:30

标签: c# linq

使用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.Keyrow类型)

所以我这样做了:

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,然后遍历每个组中的集合。

1 个答案:

答案 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属性。我不能确切地告诉你为什么要记住这一点。