考慮一個具有Proxy(類似於迭代器/智能指針在C++)抽象訪問數據。不幸的是,語法並不像C++那麼幹淨,因爲operator()不能用於重載,而operator []是單精度的,但仍然很接近。
當然,這種額外的抽象層次增加了其自身的複雜性和工作量,但它可以讓您對使用double [,,]對象的現有代碼進行微小的更改,同時允許您使用單個double [ ]數組,用於interop和您的in-C#計算。
class Matrix3
{
// referece-to-element object
public struct Matrix3Elem{
private Matrix3Impl impl;
private uint dim0, dim1, dim2;
// other constructors
Matrix3Elem(Matrix3Impl impl_, uint dim0_, uint dim1_, uint dim2_) {
impl = impl_; dim0 = dim0_; dim1 = dim1_; dim2 = dim2_;
}
public double Value{
get { return impl.GetAt(dim0,dim1,dim2); }
set { impl.SetAt(dim0, dim1, dim2, value); }
}
}
// implementation object
internal class Matrix3Impl
{
private double[] data;
uint dsize0, dsize1, dsize2; // dimension sizes
// .. Resize()
public double GetAt(uint dim0, uint dim1, uint dim2) {
// .. check bounds
return data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ];
}
public void SetAt(uint dim0, uint dim1, uint dim2, double value) {
// .. check bounds
data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ] = value;
}
}
private Matrix3Impl impl;
public Matrix3Elem Elem(uint dim0, uint dim1, uint dim2){
return new Matrix2Elem(dim0, dim1, dim2);
}
// .. Resize
// .. GetLength0(), GetLength1(), GetLength1()
}
,然後使用這種類型來讀取和寫入 - 「富[1,2,3]」現在寫爲「foo.Elem(1,2,3)。價值」,在這兩個讀取值和寫入值,分配和值表達式的左側。
void normalize(Matrix3 m){
double s = 0;
for (i = 0; i < input.GetLength0; i++)
for (j = 0; j < input.GetLength(1); j++)
for (k = 0; k < input.GetLength(2); k++)
{
s += m.Elem(i,j,k).Value;
}
for (i = 0; i < input.GetLength0; i++)
for (j = 0; j < input.GetLength(1); j++)
for (k = 0; k < input.GetLength(2); k++)
{
m.Elem(i,j,k).Value /= s;
}
}
同樣,增加開發成本,但共享數據,消除複製開銷並複製相關的開發成本。這是一個折衷。
這不起作用。 COM將**需要**具有文字double []數組。如果有的話,你會想創建一個.NET類,使雙[]行爲像雙[],。 – 2008-09-18 19:36:37