如何投射GroupedEnumerable?

时间:2010-07-08 15:46:23

标签: c# linq casting

我正在使用IQueryProvider.Execute命令,并传入一个表达式,该表达式是我的表达式树项目的一部分。此命令返回一个对象,该对象可以是OrderedEnumerable或GroupedEnumerable,具体取决于原始表达式。 GroupBy表达式创建GroupedEnumerable对象。下面的代码还创建了一个GroupedEnumerable对象,它将向您展示我遇到的问题的示例。

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
object grouped = numbers.GroupBy(n => n % 2 == 0);

当“分组”是一个对象(GroupedEnumerable)时,我无法将其强制转换为允许我在其上调用“GetEnumerator”的任何其他类型。我也无法将它转换为允许我使用“foreach”命令的任何东西。如果我将代码更改为使用“var”(如下所示),则现在分组的类型为OrderedEnumerable。我可以获取枚举器并在foreach命令中使用它。

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
var grouped = numbers.GroupBy(n => n % 2 == 0);

回到我的表达式树项目,IQueryProvider.Execute命令返回一个对象,但是当对象是GroupedEnumerable时,我需要能够将对象强制转换为OrderedEnumerable。我尝试过的所有演员都会出现一个错误:“无法将类型'System.Linq.GroupedEnumerable`3的对象强制转换为.....”。有谁能告诉我如何将对象转换为更有用的东西?

2 个答案:

答案 0 :(得分:6)

GroupBy来电的结果为IEnumerable<IGrouping<bool, int>>。如果将鼠标悬停在第二个代码示例中的单词var上,则可以看到此内容。将它投射到这种类型,它将正常工作。

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 };
object grouped = numbers.GroupBy(n => n % 2 == 0);

IEnumerable<IGrouping<bool, int>> foo = 
    (IEnumerable<IGrouping<bool, int>>)grouped;

修改

完成上述评论后,如果您的通话输出为GroupedEnumerable<MyEntityItem,int?,MyEntityItem>,则可以将其投放到IEnumerable<IGrouping<int?, MyEntityItem>>

答案 1 :(得分:2)

只需将对象转换为IEnumerable<T>即可。可枚举的实现对您来说无关紧要。