如何转换 GroupedEnumerable?(关于)IT技术

3

我正在尝试使用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);

当“grouped”是一个GroupedEnumerable对象时,我无法将其转换为任何其他类型,以便允许我调用“GetEnumerator”。我也无法将其转换为任何可以让我使用“foreach”命令的东西。如果我改变代码使用“var”(如下所示),则grouped现在是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'的对象强制转换为类型.....”的错误。 有人能告诉我如何将对象转换为更有用的东西吗?


请展示您尝试进行类型转换的代码以及具体的错误信息。 - Adam Robinson
你想要实现什么?如果你只想要偶数,你应该使用Where()而不是GroupBy()。 - Qwertie
代码示例仅是获取GroupedEnumerable的示例。从我的问题中可以看出,我正在使用返回实际上是GroupedEnumerable类型的对象的IQueryProvider.Execute方法。我的问题在于强制转换这个对象,与偶数无关。 - Retrocoder
然后,您应该提供一个反映您正在进行的代码示例。上面的示例生成一个 IEnumerable<IGrouping<bool, int>>,而不是一个 GroupedEnumerable 对象。 - Adam Robinson
好的,我已经尝试了一些方法,发现从我的IQueryProvider.Execute命令输出的对象实际上是一个“MyEntityItem,int?,MyEntityItem”的类型对象,这次绝对是GroupedEnumerable。 我一直在测试代码,所以认为我的示例提供了GroupedEnumerable的示例。我的问题是,由于它是一个内部类而没有暴露出来(据我所知),因此我无法将其转换为GroupedEnumerable。有没有办法将对象转换回此类型,以便我可以处理它? - Retrocoder
2个回答

7
您的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>>


当我尝试以这种方式进行转换时,它无法编译,因为它会给出错误信息:“IEnumerable<T>需要1个类型参数”。 - Retrocoder
@Retrocoder:抱歉,我已经编辑了答案。试一下吧。 - Adam Robinson
嗨,那个很好用,所以现在我已经将对象转换为GroupedEnumerable<MyEntityItem,int?,MyEntityItem>,这正是我想要的,非常感谢。也许你能帮我解决第二个问题。这段代码位于从IOrderedQueryable<T>派生的类的“IEnumerator<T> GetEnumerator()”方法中。我发现我无法返回“GroupedEnumerable<MyEntityItem,int?,MyEntityItem>”的枚举器,因为转换会引发错误。 - Retrocoder
错误信息为:无法将类型为 'System.Linq.GroupedEnumerable3[MyEntityItem,System.Nullable1[System.Int32],MyEntityItem]' 的对象强制转换为类型 'System.Collections.Generic.IEnumerable`1[MyEntityItem]'。是否可以进行强制转换,还是永远不可能工作? - Retrocoder

2

只需将对象转换为IEnumerable<T>。可枚举实现对您来说并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接