【问题标题】:How can I reference a 3D array from another class?如何从另一个类中引用 3D 数组?
【发布时间】:2016-09-01 04:00:31
【问题描述】:

在我的主程序类中:

 static void Main()
 {
    string[,,] anArray = new string [3,3,3];
        anArray[0,0,0] = "value1";
        anArray[0,0,1] = "value2"; .... //filling the rest of the array.
 }

如何使用具有多个参数的构造函数将这个数组传递给另一个单独的类“anotherClass”,例如:

 class AnotherClass
 {
 private string[,,] anotherClassArray;

 public string[,,] AnotherClassArray
 {
     get { return anotherClassArray;}
 }

 public AnotherClass (string[,,] fromAnArray)
 {
    anotherClassArray = new string [fromAnArray.Length];
 }
 }

我见过一些示例,其中只有一个简单的一维数组从主程序传递到另一个单独的类并再次返回,但是当我尝试按照相同的多维示例进行操作时,我得到了错误:

“尝试初始化新数组时,无法将类型 'string[]' 隐式转换为 'string[,,*]'”。

【问题讨论】:

  • 你想做什么?只是初始化 anotherClassArray 引用或 3d 数组的本地副本??

标签: c# class multidimensional-array reference main


【解决方案1】:

你可以这样做:

string[, ,] anotherClassArray = new string[anArray.GetLength(0),
                                           anArray.GetLength(1),
                                           anArray.GetLength(2)];

更新

作为一个实验,如果你想让它对任何未知数量的维度通用,你可以使用这个方法:

private Array CreateArrayWithSameDimensions(Array inArray)
{
    int[] lengths = new int[inArray.Rank];
    for (int i = 0; i < inArray.Rank; i++)
    {
        lengths[i] = inArray.GetLength(i);
    }
    Array myArray = Array.CreateInstance(typeof(string), lengths);
    return myArray;
}

这种方法的问题是访问这个数组不像使用已知维度那么简单。这是一个使用示例:

Array myArray = CreateArrayWithSameDimensions(anArray);
int[] indices = new int[anArray.Rank];

for (int i = 0; i < anArray.Rank; i++)
{
       indices[i] = 0;
}

myArray.SetValue("test", indices);

这将在该数组的下限索引中设置test。如果输入数组是一个 3 维数组,在 myArray[0,0,0] 中我们将有 test

【讨论】:

  • 感谢您的详细解释——它确实帮助我了解了引用多维数组。虽然它在我尝试时有效,但它并不是我想要的,但我会记住这个答案,因为我绝对可以看到它在需要时在未来的代码中实现很有用。再次感谢!
【解决方案2】:

如果您希望 AnotherClass 拥有它自己的独立、空的 3D 数组实例,那么您可以按照 Pikoh 所说的做。在这种情况下,如果更改数组的内容,Main中创建的原始数组不受影响,反之亦然。

如果您希望 AnotherClass 引用与在 Main 中创建的数组相同的数组,因此可以访问相同的填充内容,那么只需在 AnotherClass 构造函数中将 AnotherClass.anotherClassArray 引用设置为等于 fromAnArray,如下所示:

public AnotherClass (string[,,] fromAnArray)
{
   anotherClassArray = fromAnArray;
}

【讨论】:

  • 谢谢!,虽然 Pikoh 为我解释得更清楚,但您的方法实际上是我需要此代码的方法。非常感谢!
猜你喜欢
  • 2023-03-17
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多