C#从函数返回2d数组索引
我有一个函数,它返回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]] 如果您留下了手动指定索引的解决方案,
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;
}
}