2013-05-30 7 views
2

Я пытаюсь вставить массив экземпляров пользовательского класса в 2d массив из них в определенном положении, с этим кодом:Оклейка 1d массив в 2d массив

arr.Array.SetValue(stripe, topleft.X, topleft.Y); 

... и это дает мне System.InvalidCastException с сообщение Object cannot be stored in an array of this type.

arr.Array является MyClass[,] и stripe является MyClass[].

Что я здесь делаю неправильно?

Эта строка кода является частью более крупного метода, который загружает прямоугольную часть карты для платформы 2d. Цель состоит в том, чтобы загружать отдельные полосы плиток в массив 2d, чтобы они образовывали прямоугольник определенных размеров внутри 2d-массива плиток больших размеров.

Конечно, это можно сделать поэтапно, но нет ли способа, который позволяет это сделать?

+1

Вам нужно будет показать типы объектов, массив и объект, который вы помещаете в массив. – cerkiewny

+0

Я думаю, что массив должен быть определен как 'MyClass [,] []' вместо этого. – muratgu

+1

2d массив из 1d массивов? Я делаю игру с карточкой 2d плитки, зачем мне это нужно? – user1306322

ответ

1

Я предлагаю вам использовать длинный 1d массив вместо 2d массива. Вот пример:

static void Main(string[] args) 
{ 
    int rows = 100, cols = 100; 
    // array has rows in sequence 
    // for example: 
    // | a11 a12 a13 |  
    // | a21 a22 a23 | = [ a11,a12,a13,a21,a22,a23,a31,a32,a33] 
    // | a31 a32 a33 |  
    MyClass[] array=new MyClass[rows*cols]; 
    // fill it here 

    MyClass[] stripe=new MyClass[20]; 
    // fill it here 

    //insert stripe into row=30, column=10 
    int i=30, j=10; 
    Array.Copy(stripe, 0, array, i*cols+j, stripe.Length); 

} 
+0

Возможно, я это сделаю. Мне просто нужно создать класс, который будет обрабатывать старые вызовы массива 2d и преобразовывать их в вызовы массива 1d внутри. Тогда я смогу легко вставить полосы черепицы. – user1306322

+0

Просто убедитесь, что вы проверяете длину полосы и количество элементов до следующей строки. – ja72

0

System.InvalidCastException с сообщением Объект нельзя сохранить в массиве этого типа.

Вы бы упомянуть index из stripe массива, из которого вы, возможно, придется скопировать значение.

class MyClass 
    { 
     public string Name {get;set;} 
    } 

Использование:

// Creates and initializes a one-dimensional array. 
    MyClass[] stripe = new MyClass[5]; 

    // Sets the element at index 3. 
    stripe.SetValue(new MyClass() { Name = "three" }, 3); 


    // Creates and initializes a two-dimensional array. 
    MyClass[,] arr = new MyClass[5, 5]; 

    // Sets the element at index 1,3. 
    arr.SetValue(stripe[3], 1, 3); 

    Console.WriteLine("[1,3]: {0}", arr.GetValue(1, 3)); 
+0

Думаю, это не быстрее, чем делать двойные циклы 'for' и копировать один за другим? – user1306322

+0

@ user1306322: О скорости, для чего вам нужен двойной 'for'. Вы могли бы зацикливать только 'stripe' .. Извините, если я не в контексте. –

+0

Вы правы. Я думал о том, чтобы вставить список всех полос. – user1306322

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