2011-09-09 12 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

peopleA'があなたの匿名型でIEnumerable<IGrouping<string, A'>>、です。 IGrouping<string, A'>にはnameというプロパティがないため、最初の選択に失敗します。

ただし、第2の例のxIGrouping<string, A'>であり、これはIEnumerable<A'>を継承しています。これによりyA'と入力され、nameというプロパティがあります。これは、2番目の例がうまくコンパイルされる理由です。

x2のタイプはIEnumerable<IEnumerable<string>>です。

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

この例では、はタイプIEnumerable<string>を持つことになります。これを平らにするために、外SelectSelectManyに変更。

people.Select(x => x.name)は、同じ結果を得るのにはるかに速い方法です(順序が重要ではないと仮定して)。

関連する問題