我想使用Linq查询2D数组,但是我收到错误:
找不到源类型'SimpleGame.ILandscape [,]'的查询模式的实现。 找不到“选择”。您是否缺少对'System.Core.dll'的引用或'System.Linq'的using指令?
代码如下:
var doors = from landscape in this.map select landscape;
我已经检查过我添加了引用System.Core
并使用了System.Linq
。
有人可以给出一些可能的原因吗?
答案 0 :(得分:28)
为了将多维数组与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>
(因为您在一个from子句中表示int item
或在另一个中表示array.Cast<int>()
)。然后,您可以使用LINQ方法过滤,选择或执行您希望的任何投影。
答案 1 :(得分:16)
您的地图是一个多维数组 - 这些数组不支持LINQ查询操作(请参阅更多Why do C# Multidimensional arrays not implement IEnumerable<T>?)
您需要为数组压缩存储(可能是出于多种原因的最佳方式)或为其编写一些自定义枚举代码:
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];
}
}
}