如何在 C# 中对多维数组使用 from end 索引语法?

How to use the from end indexing syntax for multidimensional arrays in C#?

我想对二维数组使用 C# 8 从结束索引语法。如何做到这一点,或者不支持?我有一个数组索引的外部来源,并按以下方式访问它:

(int, int)[] indexes = new (int, int)[1] { (0, 1) } /* GetIndexes() */;
int[,] array = new int[1,1] /* GetArray() */;

foreach((int i, int j) in indexes)
{
    _ = array[i, array.GetLength(1) - j]; // Current
    _ = array[i, ^j]; // What I have in mind
}

但我的想法给了我编译器错误“CS0029:无法将类型 'System.Index' 隐式转换为 'int'。”

这与数组切片语法有关,因为它们都是数组操作并且在同一语言版本中发布。但是,它们仍然是不同的操作,一个人的存在从根本上并不依赖于另一个人。

谢谢

根据 Index 和 Range 语法的 proposal,该语言只会自动添加一个采用 Index 的索引器,如果:

  • The type is Countable.
  • The type has an accessible instance indexer which takes a single int as the argument.
  • The type does not have an accessible instance indexer which takes an Index as the first parameter. The Index must be the only parameter or the remaining parameters must be optional.

二维数组不满足这些要求中的第二个,即使满足了,以 one Index 作为参数的索引器也不是您想要的.搜索提案,他们似乎并没有那么多地考虑多维数组。

现在,您可以在 T[,] 上编写自己的扩展方法,需要 2 Index 秒:

static class ArrayExtensions {
    public static T Get<T>(this T[,] arr, Index x, Index y)
        => arr[
            x.IsFromEnd ? arr.GetLength(0) - x.Value : x.Value,
            y.IsFromEnd ? arr.GetLength(1) - y.Value : y.Value
        ];
}

请注意,如果您有锯齿状数组 (int[][]),索引语法 有效。