Используя Linq с 2D массивом, Выбор, не найденный

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

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

Код следует:

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

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

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

22
задан Alexei Levenkov 19 July 2016 в 15:31
поделиться

2 ответа

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

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

29
ответ дан 29 November 2019 в 04:29
поделиться

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

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

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
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: