web-dev-qa-db-ja.com

2D配列でLinqを使用して、選択が見つかりません

Linqを使用して2D配列をクエリしたいのですが、エラーが発生します。

ソースタイプ 'SimpleGame.ILandscape []'のクエリパターンの実装が見つかりませんでした。 「選択」が見つかりません。 「System.Core.dll」への参照、または「System.Linq」の使用ディレクティブがありませんか?

コードは次のとおりです。

var doors = from landscape in this.map select landscape;

参照System.Coreを含め、System.Linqを使用していることを確認しました。

誰かがいくつかの考えられる原因を教えてもらえますか?

23
LLS

多次元配列をLINQで使用するには、単純に_IEnumerable<T>_に変換する必要があります。それは非常に単純です、ここにクエリするための2つの例のオプションがあります

_int[,] array = { { 1, 2 }, { 3, 4 } };

var query = from int item in array
            where item % 2 == 0
            select item;

var query2 = from item in array.Cast<int>()
                where item % 2 == 0
                select item;
_

各構文は2D配列を_IEnumerable<T>_に変換します(一方のfrom句で_int item_と言うか、もう一方のarray.Cast<int>()と言うため)。次に、LINQメソッドを使用して、任意の投影をフィルター処理、選択、または実行できます。

30
Anthony Pegram

マップは多次元配列です-これらはLINQクエリ操作をサポートしていません(詳細を参照してください C#多次元配列がIEnumerable <T>を実装していないのはなぜですか?

アレイのストレージをフラット化するか(多くの理由でおそらく最善の方法です)、そのためのカスタム列挙コードを記述する必要があります。

public IEnumerable<T> Flatten<T>(T[,] map) {
  for (int row = 0; row < map.GetLength(0); row++) {
    for (int col = 0; col < map.GetLength(1); col++) {
      yield return map[row,col];
    }
  }
}
16
Ron Warholic