您可以使用数组访问C#多维数组索引器吗?

时间:2014-01-23 20:37:13

标签: c# multidimensional-array indexing

我试图找出是否可以将对象作为多维数组的索引值传递。

var nums = new int[3,3];
// of course you can index by literal integers
nums[0, 2] = 99;
// but can you index by an array?  This does not work
var index = new [] {0, 2};
nums[index] = 100;

// I can use GetValue with the int array, but this returns an object not an int
nums.GetValue(new [] {0, 2});

那么有谁知道我应该传递给多维数组索引器以满足编译器的类型?

4 个答案:

答案 0 :(得分:3)

简短的回答是否定的,你不能本地做到这一点。

稍长的答案是肯定的,您可以使用扩展方法实现此类行为。您可以添加适用于所有数组的扩展方法,如下所示:

public static class ArrayExtender
{
    public static T GetValue<T>(this T[,] array, params int[] indices)
    {
        return (T)array.GetValue(indices);
    }

    public static void SetValue<T>(this T[,] array, T value, params int[] indices)
    {
        array.SetValue(value, indices);
    }

    public static T ExchangeValue<T>(this T[,] array, T value, params int[] indices)
    {
        var previousValue = GetValue(array, indices);
        array.SetValue(value, indices);

        return previousValue;
    }
}

您可以使用:

        var matrix = new int[3, 3];
        matrix[0, 2] = 99;

        var oldValue = matrix.GetValue(0, 2);
        matrix.SetValue(100, 0, 2);
        var newValue = matrix.GetValue(0, 2);

        Console.WriteLine("Old Value = {0}", oldValue);
        Console.WriteLine("New Value = {0}", newValue);

输出:

Old Value = 99
New Value = 100

在大多数情况下,有一个面向对象的答案,为什么你需要这个功能,并且可以创建适当的自定义类来促进这一点。例如,我可能有一个棋盘,我用辅助方法创建了几个类:

class GameBoard
{
  public GamePiece GetPieceAtLocation(Point location) { ... }
}

答案 1 :(得分:1)

不,你不能这样做。数组索引器是语法的,它们不是“虚拟”数组。这意味着它期望用逗号分隔一系列表达式,而不是可能表示数组的表达式。

同样,您不能将三元素数组传递给需要三个参数的方法(当然,除params外)。

答案 2 :(得分:1)

不,c#数组仅由整数值索引。您必须使用整数手动遍历数组。

如果您需要按其他类型编制索引,请考虑使用Dictionary<TKey, TValue>

答案 3 :(得分:1)

你不能直接这样做,而是可以编写一个使用GetValue的通用方法,如:

class MyGenericClass<T>
{
    public static T GetValue(T[,] array, params int[] indices) 
    {
        return (T)array.GetValue(indices);
    }
}

以后你可以这样做:

int val = MyGenericClass<int>.GetValue(nums, new[] { 0, 2 });