oleg63 Ответов: 1

Как я могу преобразовать 2D - массив объектов в 2D-двойной массив?


Привет,
Как я могу преобразовать 2D массив объектов C# (saMatrix) в 2D двойной массив (dArray)?

Спасибо.

Int32 iDim = 3;
объект saMatrix = null;

- saMatrix {object[3, 3]} object {объект[,]}
[0, 0] 11.0 объект {double}
[0, 1] 12.0 объект {double}
[0, 2] 13.0 объект {двойной}
[1, 0] 21.0 объект {double}
[1, 1] 22.0 объект {двойной}
[1, 2] 23.0 объект {двойной}
[2, 0] 31.0 объект {двойной}
[2, 1] 32.0 объект {двойной}
[2, 2] 33.0 объект {двойной}
//К
double[,] dArray = новый double[iDim, iDim];

Sergey Alexandrovich Kryukov

В этом вопросе нет никакого смысла. Все зависит от того, как вы хотите отобразить эти матрицы и их элементы.
—СА

oleg63

Да, это так.
Это квадратная матрица. По сути, он передается обратно клиенту C# из COM - интерфейса как safearray вариантов(которые являются двойным типом).
На стороне C# я вижу это так, как описано выше.
Его нужно преобразовать в 2D-матрицу double.
Итак, если вы знаете ответ, пожалуйста, отправьте его ниже,
если нет, то просто не загрязняйте форум бесполезными ответами.

Sergey Alexandrovich Kryukov

Если вы возьмете на себя труд объяснить, чего вы хотите достичь должным образом, я, вероятно, отвечу.
—СА

oleg63

Забавно видеть вас "лучшим экспертом за 24 часа".
Похоже, что ответы, подобные этому, тоже работают ;)

Sergey Alexandrovich Kryukov

Весело? Нет, это не так. Ты слишком много на себя берешь. Вы действительно не читали мои посты, чтобы судить. Не пытайтесь возложить ответственность за свою неряшливость на других. Пожалуйста, ничего личного. Если вы предоставите разумную информацию, я с удовольствием дам вам очень исчерпывающий ответ, как обычно делаю, несмотря на всю вашу грубость и отсутствие сотрудничества, которое вы демонстрируете прямо сейчас.
—СА

Sinisa Hajnal

Читайте MSDN на объектах Array и ArrayList есть много конвертеров, есть некоторые на IEnumerable тоже, некоторые из них универсальные, где вы можете указать типы. Посмотрим, поможет ли кто-нибудь из них.

Sergey Alexandrovich Kryukov

ArrayList не следует использовать.
—СА

oleg63

Спасибо Синса,
До сих пор я нашел 2 типа преобразований, но они оба работают на 1D массиве.
Нравится:
двойной[] E_x = ((объект[])_x).Бросание&ЛТ;двойной&ГТ;().Метод toArray();
Массив.ConvertAll<object, double>(...)

Sergey Alexandrovich Kryukov

Очень плохо. Я говорю вам, вы должны объяснить, как должна быть представлена матрица. Что, массив двойников? что-нибудь еще? И как должны быть расположены объекты, представляющие матрицу. Вот и все, достаточно просто.
—СА

oleg63

СА, прости, если я чем-то обидел тебя. Но это очень простое и простое преобразование квадратной матрицы типа NxN объекта в абсолютно такую же размерность (2D массив), но типа double.
Я нашел, как это сделать для 1D массивов, но мне нужно преобразование для 2D массивов.
Спасибо за ответ.

Sergey Alexandrovich Kryukov

Не обижайся, пожалуйста, забудь об этом. Давайте начнем сначала: каковы элементы матрицы, имеют ли они уже двойной тип? Если нет, то каков тип элемента? Если матрица не реализована как "просто массив", то она должна иметь какой-то интерфейс, где вы получаете элемент по индексу X-Y (индекс строки-столбца). Что такое возвращаемый тип, представляющий тип элемента?

Теперь, если у вас есть только одна матрица NxN, решением будет массив NxN. Чего вы ожидаете, если у вас есть M различных матриц? Скажем, это может быть массив N*M x N, или массив N x N*M, или что-то еще? Я думаю, что мои вопросы естественны и должны быть понятны.

Сейчас, А что вы пробовали так далеко? Если это то, что я предполагал выше, или что-то просто немного другое, то это выглядит как очень простая задача: выделить массив требуемого размера, а затем заполнить if в некоторых циклах. В чем проблема?

И, наконец, зачем все это делать, какова цель?

—СА

oleg63

Итак, начнем...
Существует COM-сервер, который имеет рутину:
[идентификатор(332), helpstring("GetAMatrix способ")] HRESULT см. В разделе GetAMatrix([в] долго iDimensions,[из] вариант *saMatrix,[В,] и шорт* iErr);

iDimensions - размеры квадратной матрицы(для 3 dim это будет матрица 3X3 ;)
saMatrix - квадратная матрица заданного размера, которая формируется COM-сервером в виде 2D SAFEARRAY вариантов(внутренне каждая переменная варианта имеет тип double, vt = double).
На стороне C# у нас есть:
частная button_test_Click недействительным(объект отправителя, EventArgs в электронной)
{
Int32 iDim = 3;
объект saMatrix = null;
theCOM.GetAMatrix(iDim, out saMatrix, ref iErr);
double[,] dArray = новый double[iDim, iDim];
//поместите свое преобразование из saMatrix в dArray здесь ;)
...
}

Обозреватель объектов C# имеет описание процедуры COM:
GetAMatrix( int, out object, ref short)

Возвращенный матричный вид(из отладчика C# ):
- saMatrix {object[3, 3]} object {объект[,]}
[0, 0] 11.0 объект {double}
[0, 1] 12.0 объект {double}
[0, 2] 13.0 объект {двойной}
[1, 0] 21.0 объект {double}
[1, 1] 22.0 объект {двойной}
[1, 2] 23.0 объект {двойной}
[2, 0] 31.0 объект {двойной}
[2, 1] 32.0 объект {двойной}
[2, 2] 33.0 объект {двойной}

Я думаю, что это достаточно подробно(если вы знаете ком :)

Техника литья, которую я описал ранее, работает только на одномерных массивах и не работает для 2D-массивов, которые являются моей матрицей. Это проблема. О, цель... ;-\ - передать матрицу(в основном 2D массив двойного типа) с COM-сервера на клиент C#...

Так что же вы об этом думаете???


Sergey Alexandrovich Kryukov

Я думаю, что вам просто нужно сделать все это элемент за элементом. Действительно. Создайте массив ожидаемого размера и заполните его.
Трудно сказать, как вы оказались с таким мусором (вариант был действительно плохой идеей COM даже на первом месте), который вы должны использовать, может быть, какое-то наследие...
—СА

oleg63

Вы закончите с таким мусором, если ваш COM-сервер потребует поддержки любого вида клиентов(ранняя привязка и поздняя привязка), и только типы автоматизации будут выполнять эту работу.

Sergey Alexandrovich Kryukov

Я вижу...
—СА

Sinisa Hajnal

Да, извините за это, я слишком быстро прочитал и прочитал, что вам нужно преобразовать матрицу в массивы, а не один массив.

Тривиальный способ состоит в том, чтобы использовать 1D транформацию для строк и назначить каждый результирующий массив вашей матрице - или даже перебирать каждый элемент по обеим осям.

1 Ответов

Рейтинг:
5

Wendell D H

Я искал способы сделать это с массивом.ConvertAll, но были проблемы.
Но это должно сработать.
Это предполагает, что вы не знаете размеров размеров массива

//Your original object
object saMatrix = new object[3, 3] {{ 11.0, 12.0, 13.0 },
                                    { 21.0, 22.0, 23.0 },
                                    { 31.0, 32.0, 33.0 } };

//Create an array of doubles the same size.
double[,] dArray = new double[((object[,])saMatrix).GetUpperBound(0) + 1,
                              ((object[,])saMatrix).GetUpperBound(1) + 1];

//Cast and fill each item
for (int x = 0; x <= ((object[,])saMatrix).GetUpperBound(0); x++)
{
   for (int y = 0; y <= ((object[,])saMatrix).GetUpperBound(1); y++)
   {
     dArray[x, y] = (double)((object[,])saMatrix)[x, y];
   }
}


oleg63

Венделл Д Х,
Большое спасибо. Все работает.
Вы-человек дня...
- Хорошего вам дня :)
Олег.