Я хочу использовать Linq для запросов 2D массива, но я получаю ошибку:
Не удалось найти реализацию шаблона запроса для исходного типа 'SimpleGame. ILandscape []'. 'Выберите' не найденный. Вы пропускаете ссылку на 'System.Core.dll' или директиву использования для 'Системы. Linq'?
Код следует:
var doors = from landscape in this.map select landscape;
Я проверил, что включал ссылку System.Core
и использование System.Linq
.
Кто-либо мог дать некоторые возможные причины?
Чтобы использовать многомерный массив с 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.
Ваша карта представляет собой многомерный массив - они не поддерживают операции запросов 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];
}
}
}