嵌套的Linq查询的行为与预期不符

时间:2011-09-09 00:47:46

标签: linq

我的问题非常简单,在开头的下面是一段代码

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));

1 个答案:

答案 0 :(得分:2)

peopleIEnumerable<IGrouping<string, A'>>,其中A'是您的匿名类型。 IGrouping<string, A'>没有name属性,这就是第一个选择失败的原因。

但是,第二个示例中的xIGrouping<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)可以更快地获得相同的结果(假设排序不重要)。