访问多维数组的一维

时间:2015-04-30 13:08:25

标签: c# multidimensional-array

我有一个多维数组,如下所示:

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

4 个答案:

答案 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();