我试图找出是否可以将对象作为多维数组的索引值传递。
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});
那么有谁知道我应该传递给多维数组索引器以满足编译器的类型?
答案 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 });