Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从函数返回2d数组索引_C#_Arrays_Multidimensional Array - Fatal编程技术网

C#从函数返回2d数组索引

C#从函数返回2d数组索引,c#,arrays,multidimensional-array,C#,Arrays,Multidimensional Array,我有一个函数,它返回2d数组的索引,如下所示 public int[] getIndex() { return new int[2] { i, j }; } 我希望能够使用此函数直接访问2d数组的值,例如 var val = array[getIndex()] 但是getIndex()抛出了一个错误。是否有其他方法可以返回2d数组的键?还是必须手动指定 var val = array[getIndex()[0], getIndex()[1]] 如果您留下了手动指定索引的解决方案,

我有一个函数,它返回2d数组的索引,如下所示

public int[] getIndex()
{
    return new int[2] { i, j };
}
我希望能够使用此函数直接访问2d数组的值,例如

var val = array[getIndex()]
但是getIndex()抛出了一个错误。是否有其他方法可以返回2d数组的键?还是必须手动指定

 var val = array[getIndex()[0], getIndex()[1]]

如果您留下了手动指定索引的解决方案,我建议使用下面的代码。假设您
getIndex()
所做的不仅仅是返回一些内部变量,那么这段代码的性能会更好

var requiredItemIndex=getIndex();
var val=数组[requiredItemIndex[0],requiredItemIndex[1]];
您可以使用:

请注意,这需要强制转换。在本例中,我使用了
int
,但您需要为数组使用正确的类型

如果您不喜欢强制转换,可以编写一个扩展方法:

public static class Array2DExt
{
    public static T At<T>(this T[,] array, int[] index)
    {
        return (T) array.GetValue(index);
    }
}

<>我会考虑创建一个自定义的2D数组,并使用一个值元组或一个自定义点类型来描述索引。例如:

public class My2DArray<T>{

    public int Width { get; }
    public int Height { get; }
    public T[] Data { get; }
    public My2DArray(int width, int height)
    {
        Width = width;
        Height = height;
        Data = new T[width * height];
    }

    public T this[int x, int y]
    {
        get => Data[y * Width + x];
        set => Data[y * Width + x] = value;
    }
    public T this[(int x, int y) index]
    {
        get => Data[index.y * Width + index.x];
        set => Data[index.y * Width + index.x] = value;
    }
}
公共类My2DArray{
公共整数宽度{get;}
公共整数高度{get;}
公共T[]数据{get;}
公共My2DArray(整型宽度、整型高度)
{
宽度=宽度;
高度=高度;
数据=新T[宽度*高度];
}
公共T这个[int x,int y]
{
get=>数据[y*宽度+x];
set=>Data[y*宽度+x]=值;
}
公共T此[(整数x,整数y)索引]
{
get=>Data[index.y*Width+index.x];
set=>Data[index.y*Width+index.x]=值;
}
}

这种方法的一个优点是,您可以直接访问备份阵列。因此,如果您只想处理所有项目,而不关心它们的位置,则可以使用普通循环。

这是否回答了您的问题@所以我必须要单独上课?没有其他方法(Yap:)或者改用字典,因为字典已经支持元组索引,但是请注意。
var element = array.At(getIndex());
public class My2DArray<T>{

    public int Width { get; }
    public int Height { get; }
    public T[] Data { get; }
    public My2DArray(int width, int height)
    {
        Width = width;
        Height = height;
        Data = new T[width * height];
    }

    public T this[int x, int y]
    {
        get => Data[y * Width + x];
        set => Data[y * Width + x] = value;
    }
    public T this[(int x, int y) index]
    {
        get => Data[index.y * Width + index.x];
        set => Data[index.y * Width + index.x] = value;
    }
}