Используя Linq с 2D массивом, Select not found - PullRequest
22 голосов
/ 30 июня 2010

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

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

Код следующий:

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

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

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

Ответы [ 2 ]

29 голосов
/ 30 июня 2010

Чтобы использовать многомерный массив с 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;

Каждый синтаксис преобразует двумерный массив в IEnumerable<T> (потому что вы говорите int item в одном из предложения from или array.Cast<int>() в другом).Затем вы можете фильтровать, выбирать или выполнять любую проекцию, какую пожелаете, используя методы LINQ.

16 голосов
/ 30 июня 2010

Ваша карта представляет собой многомерный массив - они не поддерживают операции запроса 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];
    }
  }
}
...