実際のインデックスを格納する独自のマトリックス型を実装できます
public class Matrix<T>
{
private T[, ,] _array;
public Matrix(int sizeX, int sizeY, int sizeZ)
{
_array = new T[sizeX, sizeY, sizeZ];
}
public T this[int i, int j, int k]
{
get { return _array[i, j, k]; }
set { _array[i, j, k] = value; }
}
public int CurrentI { get; set; }
public int CurrentJ { get; set; }
public int CurrentK { get; set; }
public void SetCurrentCell(int i, int j, int k)
{
CurrentI = i;
CurrentJ = j;
CurrentK = k;
}
public T Current
{
get { return _array[CurrentI, CurrentJ, CurrentK]; }
set { _array[CurrentI, CurrentJ, CurrentK] = value; }
}
public static implicit operator T(Matrix<T> matrix)
{
return matrix.Current;
}
// The assignment operator (=) cannot be overloaded. But we can overload |
// instead, allowing us to write: m |= value in order to perform an assignment.
public static Matrix<T> operator |(Matrix<T> m, T value)
{
m.Current = value;
return m;
}
}
次のように使用できます。
var m = new Matrix<int>(3, 3, 3);
m[0, 2, 1] = 77;
m.SetCurrentCell(0, 2, 1);
m.Current = 88;
int value = m; // Using the implicit operator and the current indexes
m |= 20; // Using |= as assignment operator
ジェネリック アプローチには、数値演算の実装がより困難になるという欠点があります (+、-、、/ などの数学演算はジェネリック型では定義されません)。ただし、数値計算を実装する派生クラスでジェネリック型を解決できます
public class DoubleMatrix : Matrix<double> {
public static DoubleMatrix operator +(DoubleMatrix a, DoubleMatrix b)
{
//TODO: Implement + operator
return m;
}
//TODO: Implement other operators
}
C# 7.0 では ref ローカルが導入され、まさにそれが可能になりました
ref int xx = ref myArray[i, j, k];
if (xx == someValue)
xx = someOtherValue;
else
throw new Exception(string.Format("value {0} is wrong!", xx));
シノニムだけでなく参照も取得することに注意してください。つまり、配列インデックスは 1 回だけ評価されます。