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>
看看它:
我的问题:
如果分组包含项目(实现不可数) - 为什么其类型为GroupedEnumerable
和不
IEnumerable <System.Linq.IGrouping<string,ConsoleApplication15.Fruit>>
为什么他们创建了一个新的类型GroupedEnumerable
?
答案 0 :(得分:7)
如果.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调试器向您显示对象的运行时类型,因为这是调试器的用途:向您显示运行时信息。