C#中的Linq - GroupedEnumerable用法是什么?

4
 Fruit[] data = new[] {
                new Fruit {Name = "Gala",Type = "Apple",Price = 0.75m,Quantity = 10}, 
                new Fruit {Name = "Granny Smith",Type = "Apple",Price = 0.80m,Quantity = 7},
                new Fruit {Name = "Tasty",Type = "Strawberries",Price = 1.90m,Quantity = 20}
                       };

 var grouped = from fruit in data
                          group fruit by fruit.Type;

grouped类型是:System.Linq.GroupedEnumerable<ConsoleApplication15.Fruit,string,ConsoleApplication15.Fruit>

看一下这个: enter image description here

我的问题是:

如果grouped包含项目(实现IEnumerable),为什么它的类型是GroupedEnumerable不是 Enumerable

IEnumerable <System.Linq.IGrouping<string,ConsoleApplication15.Fruit>>

为什么他们创建了一个新的类型,即GroupedEnumerable

3
很简单:一个对象必须是某个具体类型,不能只是接口。 - svick
@svick 我不明白你的意思... 如果您能多说几句就更好了 :) - Royi Namir
@svick 我不必通过对象迭代,我也可以通过接口迭代... - Royi Namir
1个回答

9
如果你在 .Net 中有一个对象,它必须是某种具体类型,不能是一个接口。例如,`new IList<int>()` 是无效的,你需要做类似于 `new List<int>()` 的事情。
如果你有一个变量,它的类型可以是一个接口,所以你可以写,例如,`IList<int> list = new List<int>()`。
这正是这里正在发生的事情。变量 `grouped` 的类型是 `IEnumerable<IGrouping<string,Fruit>>`(虽然从代码中不清楚,因为你使用了 `var`)。该变量引用的对象类型是 `GroupedEnumerable<Fruit, string, Fruit>`,它是 `GroupBy()` 实现中使用的内部类型。它不能是 `IEnumerable`,因为你不能有一个接口实例。
Visual Studio 调试器显示给你运行时对象类型,因为这就是调试器的作用:显示给你运行时信息。

svick - 通过 ReSharper,当我站在“var”上时,它建议我更改为显式类型,并将其更改为IEnumerable<IGrouping<string, Fruit>> grouped = from fruit in data group fruit by fruit.Type;...所以我不明白-我可以使用两者...就像 IList 和 List 一样...为什么会这样? - Royi Namir
使用 IEnumerable 的代码与使用 var 的代码完全相同,因为这是查询的返回类型。你不能使用 GroupedEnumerable,因为它是内部的。但我不确定你到底不理解什么。 - svick
嗨,谢谢回复。我可以得出这样的结论吗:“通过接口访问对象,但我不能通过接口访问到另一个接口,必须要有一些具体类”? - Royi Namir

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