C#从函数返回二维数组索引

Posted

技术标签:

【中文标题】C#从函数返回二维数组索引【英文标题】:C# return 2d array index from function 【发布时间】:2021-05-01 02:48:44 【问题描述】:

我有一个函数可以像这样返回二维数组的索引

public int[] getIndex()

    return new int[2]  i, j ;

我希望能够使用这个函数直接访问二维数组的值,例如

var val = array[getIndex()]

但是 getIndex() 会抛出错误。有没有其他方法可以返回二维数组的键?还是我必须手动指定

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

【问题讨论】:

这能回答你的问题吗? Why tuple type is not accepted as a multidimensional array index? @OfirD 所以我必须有一个单独的课程?没有别的办法了吗? Yap :) 或者改用字典,它已经支持使用元组进行索引,但请注意it comes with a performance cost。 【参考方案1】:

你可以使用Array.GetValue():

int element = (int)array.GetValue(getIndex());

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

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

public static class Array2DExt

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

你会这样称呼:

var element = array.At(getIndex());

【讨论】:

【参考方案2】:

如果您在解决方案中手动指定索引,我建议您改用下面的代码。假设你 getIndex() 不仅仅返回一些内部变量,这段代码的性能会更好。

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

【讨论】:

【参考方案3】:

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

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;
    

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

【讨论】:

以上是关于C#从函数返回二维数组索引的主要内容,如果未能解决你的问题,请参考以下文章

返回一个二维数组(在 C# 和 C++ 中)

在 C# 中创建一个二维数组

将二维双数组从 C# 传递到 C++ 函数

Swift:填充二维数组时出现索引超出范围错误

知识分享:C/C++函数返回二维数组指针

有没有办法在二维数组中找到输入值的每个索引?