C# 使用动态linq分组后的访问密钥
使用我有一个group by语句,如下所示:C# 使用动态linq分组后的访问密钥,c#,linq,C#,Linq,使用我有一个group by语句,如下所示: var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c)); 其中c只是我需要在分组中选择的字段名的字符串数组GroupBy在本例中返回一个IEnumerable(注意:不是IEnumerable,因为我们不知道t是什么)。正则表达式将返回一个System.Collections.Generic.IEnumerable 现在我的问题是,我如何遍历这些组以访问密钥(key在i
var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c));
其中c
只是我需要在分组中选择的字段名的字符串数组GroupBy
在本例中返回一个IEnumerable
(注意:不是IEnumerable
,因为我们不知道t
是什么)。正则表达式将返回一个System.Collections.Generic.IEnumerable
现在我的问题是,我如何遍历这些组以访问密钥(key
在igroupping
中定义,但我事先不知道TKey
和TElement
中)
我最初试过:
foreach (var row in rowGrouped)
它会迭代,但我无法访问行。键
(行
在本例中是type对象
)
所以我这样做了:
foreach (IGrouping<object,dynamic> row in rowGrouped)
我需要能够遍历
行分组
,为每个行
获取键
,然后遍历每个组中的集合。问题是,您的键是短
,并且您正试图强制转换到键为对象
的界面。虽然IGrouping
具有协变类型参数,但它根本不起作用,因为。由于short
是一种值类型,因此它将不起作用
如果您知道密钥始终是短的
,则应将其转换为短的
foreach (IGrouping<short, dynamic> row in rowGrouped)
...
虽然我个人对此有过一些麻烦。可能是一个bug,但在这种情况下,运行时无法确定该行是否具有
键
属性。我不能告诉你确切的原因,但请记住。我想你不能把它叫做“分组”?@Chris:我也试过了。没用。同样的问题。有关更多信息,请参阅:问题是我不知道密钥总是短的。有时是,有时是字符串或其他东西。foreach(rowGrouped中的动态行)
的问题是我得到了RuntimeBinderException
消息'object'不包含“Key”的定义。
这很奇怪,因为当我在调试器中将鼠标悬停在行
上时,我可以看到键
。对于如何使用查询,我没有太多的上下文,但您必须想出一种方法,使键始终成为引用类型。您可以在分组时执行类似于data.GroupBy(string.Format(“new({0}as Key)”,rGroup),string.Format(“new({0})”,c))
的操作,然后您只需记住实际的键位于键的键的属性中。当然,还有其他方法可以解决这个问题,但这可能是最简单的实现方法。事实上,这正是我一直在寻找的解决方案。我有一个相关的问题,那就是从不同的角度处理相同的问题,实际上有两个字段,一个是year
,另一个是qtr
,我想合并到一个专栏中。我认为将它们选为new(year,qtr)
实际上解决了这两个问题,我可以将该对象正确格式化为yearQqt
作为前端的一个问题。
foreach (IGrouping<short, dynamic> row in rowGrouped)
...
foreach (dynamic row in rowGrouped)
...