Подтвердить что ты не робот

Использование Linq с 2D-массивом, Select not found

Я хочу использовать Linq для запроса 2D-массива, но я получаю сообщение об ошибке:

Не удалось найти реализацию шаблона запроса для типа источника "SimpleGame.ILandscape [,]".      "Выбрать" не найдено. Вам не хватает ссылки на "System.Core.dll" или директиву для "System.Linq"?

Следующий код:

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

Я проверил, что я включил ссылку System.Core и используя System.Linq.

Может ли кто-нибудь дать некоторые возможные причины?

4b9b3361

Ответ 1

Чтобы использовать многомерный массив с LINQ, вам просто нужно преобразовать его в IEnumerable<T>. Это достаточно просто, вот два примера для запроса

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> (потому что вы говорите int item в одном из предложения или array.Cast<int>() в другом). Затем вы можете фильтровать, выбирать или выполнять любой проект, который вы хотите использовать с помощью методов LINQ.

Ответ 2

Ваша карта представляет собой многомерный массив - они не поддерживают операции запроса LINQ (см. больше Почему С# многомерные массивы не реализуют IEnumerable < gt;?)

Вам нужно либо сгладить хранилище для вашего массива (возможно, лучший способ по многим причинам), либо написать для него какой-то пользовательский код перечисления:

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];
    }
  }
}