Linqを使用して2D配列をクエリしたいのですが、エラーが発生します。
ソースタイプ 'SimpleGame.ILandscape [、]'のクエリパターンの実装が見つかりませんでした。 「選択」が見つかりません。 「System.Core.dll」への参照、または「System.Linq」の使用ディレクティブがありませんか?
コードは次のとおりです。
var doors = from landscape in this.map select landscape;
参照System.Core
を含め、System.Linq
を使用していることを確認しました。
誰かがいくつかの考えられる原因を教えてもらえますか?
多次元配列を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メソッドを使用して、任意の投影をフィルター処理、選択、または実行できます。
マップは多次元配列です-これらは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];
}
}
}