Использование 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
.
Может ли кто-нибудь дать некоторые возможные причины?
Ответы
Ответ 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];
}
}
}