none
LINQ で多次元配列を使用する方法 RRS feed

  • 質問

  • LINQ の質問です。

     

    多次元配列を from 句のデータソースとして入力したいのですが、例えば次のようにプログラムしてもコンパイルエラーになります。

     

    Code Snippet

    int[,] d = {{1, 2}, {3, 4}};

    var a = from v in d select v;

     

     

    LINQ で多次元配列を 使用する方法は無いでしょうか。

    2008年5月6日 6:33

回答

  • Code Snippet
    var a = from int v in d select v;

     

     

    これで。

    2008年5月6日 7:53
  • Array クラスは非ジェネリックな IList ほかのインターフェイスを実装しますが、ジェネリックなインターフェイスは実装しません。それらは実行時に配列に提供されます。

    で、記述が無いので挙動からの判断ですが、多次元配列にはジェネリックなインターフェイスが提供されません。非ジェネリックな IEnumerable しか使えません。そのため型推論も不可能です。

    なので、from 句で明示的に型指定する(Cast<T>() によって IEnumerable<T> に変換する)必要があるわけです。

    2008年5月6日 12:29

すべての返信

  • Code Snippet
    var a = from int v in d select v;

     

     

    これで。

    2008年5月6日 7:53
  • ありがとうございます。助かりました。

     

    ところで、1次元配列だと明示的な型指定は不要なのに、2次元以上の配列だとなぜ必要なのでしょうか。

     

    素人考えでは、配列の要素の型はコンパイラにとってどちらも容易に特定できそうなものですが・・・ 型指定しない場合、他のどんな型と曖昧になって推測できなくなるのでしょうか。

    2008年5月6日 11:44
  • Array クラスは非ジェネリックな IList ほかのインターフェイスを実装しますが、ジェネリックなインターフェイスは実装しません。それらは実行時に配列に提供されます。

    で、記述が無いので挙動からの判断ですが、多次元配列にはジェネリックなインターフェイスが提供されません。非ジェネリックな IEnumerable しか使えません。そのため型推論も不可能です。

    なので、from 句で明示的に型指定する(Cast<T>() によって IEnumerable<T> に変換する)必要があるわけです。

    2008年5月6日 12:29
  •  Hongliang さんからの引用

    多次元配列にはジェネリックなインターフェイスが提供されません。非ジェネリックな IEnumerable しか使えません。そのため型推論も不可能です。

    なので、from 句で明示的に型指定する(Cast<T>() によって IEnumerable<T> に変換する)必要があるわけです。

     

    なるほど、納得できました。

    ありがとうございました。

    2008年5月6日 14:18