2011-09-09 102 views
1

很簡單,因爲在之後開始嵌套的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)); 

回答

2

peopleIEnumerable<IGrouping<string, A'>>,其中A'是你的匿名類型。 IGrouping<string, A'>沒有name屬性,這就是爲什麼第一次選擇失敗。

但是,第二個示例中的xIGrouping<string, A'>,它繼承IEnumerable<A'>。這使得y鍵入爲A',它具有name屬性。這就是爲什麼第二個例子編譯得很好。

請注意,x2將有類型IEnumerable<IEnumerable<string>>。弄平此,改變外SelectSelectMany

var x3 = people.SelectMany(x => x.Select(y => y.name)); 

在這個例子中,將具有類型IEnumerable<string>

這是所有的學術,當然,因爲people.Select(x => x.name)將是一個更快的方式來獲得相同的結果(假設排序不重要)。