我有一个多维数组,如下所示:
public static int[,] GameObjects = new int[,]
{
//Type,X,Y,Width,Height
{0,50,50,10,100},
{1,50,150,10,20}
};
我试图访问一个" row"值并将它们存储到for
循环中的变量中:
for (int i = 0; i < gameObjectData.Length; i++)
{
int[] g = gameObjectData[i];
}
我希望g存储第一个数组的值,因此在第一个循环中g应存储0,50,50,10,100
。代码提供错误Wrong number of indices inside []; expected 2
答案 0 :(得分:3)
您收到此错误是因为您尝试使用多维数组,就好像它是锯齿状数组一样。
更改
int[,]
到
int[][]
你会没事的。
Read here about the differences between these types of arrays.
答案 1 :(得分:2)
没有二维数组的暴露机制来从中获取单维数组。
如果您有锯齿状阵列,则可能:
int[][] array;
//populate array
int[] row = array[1];
如果你需要一个多维数组,那么你所能做的最好就是创建一个类来保存二维数组和一个行号,并公开一个索引器来访问该行中的项目;它可能看起来类似于数组,但它实际上不是一个。
这样的东西会让你骨瘦如柴;如果你想使类型扩展IList<T>
,你也可以这样做。
public class ArrayRow<T> : IEnumerable<T>
{
private T[,] array;
private int index;
public ArrayRow(T[,] array, int index)
{
this.array = array;
this.index = index;
}
public T this[int i]
{
get { return array[index, i]; }
set { array[index, i] = value; }
}
public int Count { get { return array.GetLength(1); } }
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < Count; i++)
yield return this[i];
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public static ArrayRow<T> GetRow<T>(this T[,] array, int index)
{
return new ArrayRow<T>(array, index);
}
或者,您可以将多维数组中每一行的值复制到一个新的单维数组中,但不会反映对另一个数组所做的更改。
答案 2 :(得分:0)
对于multidimensional arrays,您需要像这样访问它们:
// access 0,1
gameObjectData[0,1];
// access 5,4
gameObjectData[5,4];
// So in general is
gameObjectData[x,y];
您只能通过提供[x]来访问它,因此会为您的问题提供:
// asuming you want row 0
int row = 0;
// this give to g the size of the row of gameObjectData
int[] g = new int[gameObjectData.getLenght(row)];
for (int i = 0; i < gameObjectData.getLenght(row); i++)
{
g[i] = gameObjectData[row,i];
}
答案 3 :(得分:0)
如果你喜欢单行,那么这是一个LINQ:
int rowIndex = 0;
firstRow = Enumerable.Range(0, gameObjectData.GetLength(1-rowIndex))
.Select(v => gameObjectData[rowIndex,v])
.ToArray();