使用Linq和2D数组,选择未找到

LLS*_*LLS 22 c# linq multidimensional-array

我想使用Linq查询2D数组,但是我收到一个错误:

找不到源类型'SimpleGame.ILandscape [ , ]' 的查询模式的实现.找不到"选择".您是否缺少对'System.Core.dll'的引用或'System.Linq'的using指令?

代码如下:

var doors = from landscape in this.map select landscape;
Run Code Online (Sandbox Code Playgroud)

我已经检查过我包含的参考System.Core和使用System.Linq.

谁能给出一些可能的原因?

Ant*_*ram 29

为了将多维数组与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;
Run Code Online (Sandbox Code Playgroud)

每种语法都会将2D数组转换为IEnumerable<T>(因为你int item在一个from子句或array.Cast<int>()另一个中说).然后,您可以使用LINQ方法过滤,选择或执行您希望的任何投影.

  • +1 比我的简洁得多(除非您需要自定义枚举行为);) (2认同)
  • 'foreach`循环结构不需要@LLS,`IEnumerable <T>`.`Array`实现`IEnumerable`,这符合要求.对于foreach,结构需要实现/可隐式转换为可枚举接口(`IEnumerable`或`IEnumerable <T>`)或具有适当的`GetEnumerator`和`MoveNext`方法.有关更多详细信息,请参阅C#语言规范的第8.8.4节. (2认同)

Ron*_*lic 16

您的地图是一个多维数组 - 这些数组不支持LINQ查询操作(请参阅更多内容为什么C#多维数组不实现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];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)