none
ラムダ式のパラメータの型に定義されたインデクサが使えない RRS feed

  • 質問

  • 他の言語では試していませんが、
    			var 行列=new Dictionary<String,Dictionary<String,Int32>>();
    			var q=行列["行"].Select(a=>a["列"]);
    
    このコードではa["列"]というコードは構文エラーになります。
    これは不可能なのでしょうか?
    2009年12月15日 23:51

回答

  • 補足させてください。
    この場合の a というパラメータの型は、表示されるエラーメッセージにあるように KeyValuePaire<> です。
    これは入れ子にされた Dictionary の各要素のキー値とそれに対応する値になります。
    和和和さんは a を Dictionary のように扱われていますので構文エラーになります。

    この Select では、入れ子にされた Dictionary に "列" 以外のキーがあれば、それらについてもすべて呼び出されます。
    そのため、Select の中で "列" に限定しようとされていることの意図も不明です。
    どのようなことをされたいのでしょうか?

    "行" と "列" で示される値は一意のため、
    var value = 行列["行"]["列"];
    にて取得できてしまいます。

    "行" に含まれる値をすべて取得することが目的でしたら、
    var values = 行列["行"].Values;

    var q = 行列["行"].Select(a => a.Value);
    になります。

    • 回答としてマーク 和和和 2009年12月17日 0:27
    2009年12月16日 1:29
  • TH01さんの意見をヒントに解決しました。ありがとうございました。
    やりたいことはデータベース的に表を名前で指定しその全ての行の特定の列の集合取り出したかったのです。
    先に出した例のネーミングが間違っておりそれにより自身の勘違いを出していました。
    表集合["表の名前"].Select(a => a["列の名前"]);
    ↑を実現するデータ型は
    var 表集合=new Dictionary<String,List<Dictionary<String,Int32>>>();
    
    です。
    ラムダ式はデータ型の理解が階層が深くなりがちでハマりやすいかも。
    • 回答としてマーク 和和和 2009年12月17日 0:27
    2009年12月17日 0:27

すべての返信

  • ラムダ式の左辺は入力パラメータになりますので、構文エラーになります。

    ラムダ式 (C# プログラミング ガイド)
    http://msdn.microsoft.com/ja-jp/library/bb397687.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年12月16日 0:26
    モデレータ
  • 補足させてください。
    この場合の a というパラメータの型は、表示されるエラーメッセージにあるように KeyValuePaire<> です。
    これは入れ子にされた Dictionary の各要素のキー値とそれに対応する値になります。
    和和和さんは a を Dictionary のように扱われていますので構文エラーになります。

    この Select では、入れ子にされた Dictionary に "列" 以外のキーがあれば、それらについてもすべて呼び出されます。
    そのため、Select の中で "列" に限定しようとされていることの意図も不明です。
    どのようなことをされたいのでしょうか?

    "行" と "列" で示される値は一意のため、
    var value = 行列["行"]["列"];
    にて取得できてしまいます。

    "行" に含まれる値をすべて取得することが目的でしたら、
    var values = 行列["行"].Values;

    var q = 行列["行"].Select(a => a.Value);
    になります。

    • 回答としてマーク 和和和 2009年12月17日 0:27
    2009年12月16日 1:29
  • TH01さんの意見をヒントに解決しました。ありがとうございました。
    やりたいことはデータベース的に表を名前で指定しその全ての行の特定の列の集合取り出したかったのです。
    先に出した例のネーミングが間違っておりそれにより自身の勘違いを出していました。
    表集合["表の名前"].Select(a => a["列の名前"]);
    ↑を実現するデータ型は
    var 表集合=new Dictionary<String,List<Dictionary<String,Int32>>>();
    
    です。
    ラムダ式はデータ型の理解が階層が深くなりがちでハマりやすいかも。
    • 回答としてマーク 和和和 2009年12月17日 0:27
    2009年12月17日 0:27