我的问题非常简单,在开头的下面是一段代码
var list = new[] {
new { name = "lixiang", age = 14 },
new { name = "lixiang", age = 16 },
new { name = "lidian", age = 14 }
};
var people = list.GroupBy(x => x.name);
这会给我一个编译错误,因为人是一组记录:
var x1 = people.Select(x => x.name);
但我不明白的是,为什么这个成功编译?
var x2 = people.Select(x => x.Select(y => y.name));
答案 0 :(得分:2)
people
是IEnumerable<IGrouping<string, A'>>
,其中A'
是您的匿名类型。 IGrouping<string, A'>
没有name
属性,这就是第一个选择失败的原因。
但是,第二个示例中的x
是IGrouping<string, A'>
,它继承了IEnumerable<A'>
。这使得y
键入为A'
,其具有name
属性。这就是为什么第二个例子编译得很好。
请注意,x2
的类型为IEnumerable<IEnumerable<string>>
。要展平,请将外部Select
更改为SelectMany
:
var x3 = people.SelectMany(x => x.Select(y => y.name));
在此示例中,x3
的类型为IEnumerable<string>
。
当然,这都是学术性的,因为people.Select(x => x.name)
可以更快地获得相同的结果(假设排序不重要)。