2016-05-06 11 views
2

В основном классе программы у меня есть:Как я могу ссылаться на трехмерный массив из другого класса?

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]; 
} 
} 

Я видел примеры с простым простым 1-мерным массивом, передаваемым из основной программы в другой отдельный класс и обратно, но когда я попытался выполнить один и тот же пример для многомерного, я получаю ошибку:

«Невозможно неявно convert type 'string []' to 'string [,, *]' "при попытке инициализировать новый массив.

+0

Что вы хотите сделать? Просто инициализируйте ссылку 'anotherClassArray' или локальную копию 3d-массива? –

ответ

1

Если вы хотите, чтобы у AnotherClass был свой отдельный, пустой экземпляр 3D-массива, вы можете делать то, что сказал Пико. В этом случае, если вы измените содержимое массива, исходный массив, созданный в Main, не будет затронут, и наоборот.

Если вы хотите, чтобы AnotherClass ссылался на тот же массив, что и тот, который был создан в Main, и для этого он имеет доступ к тому же самому заполненному содержимому, то просто установите ссылку AnotherClass.anotherClassArray равным из AnArray в конструкторе AnotherClass следующим образом:

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

Спасибо !, Хотя Pikoh объяснил это более четко для меня, ваш метод был фактически тем, который мне нужен для этого кода. Спасибо! – 5120bee

1

Вы можете сделать это следующим образом:

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

Update

В эксперименте, если вы хотите сделать это общий для любого неизвестного числа измерений, вы можете использовать этот метод:

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.

+0

Спасибо за подробное объяснение - это действительно помогло мне узнать о ссылках на многомерные массивы. Хотя это сработало, когда я это пробовал, это было не совсем то, что я искал, но я буду учитывать этот ответ, потому что я определенно вижу, что он полезен для реализации в будущем коде, когда это необходимо. Еще раз спасибо! – 5120bee

Смежные вопросы