примечание: комментарий BJ Myers был полезен и был ответом на самом деле. Однако, поскольку это был комментарий, я не мог отметить это как ответ, но я поместил исправленный код (используя его совет) в конце этого вопроса.Как извлечь строку из массива в C#?
ниже продолжаетОригинальный вопрос:
Эта ситуация может выглядеть странно на первый, но вот то, что я намерен сделать:
Подобно синтаксиса в Python, вместо создания многомерного массива (2-й массив, если быть точным), я хочу создать массив массивов (фактически вектор векторов).
Я знаю, что C# не позволит мне создавать указатели в безопасном коде, но мне все же интересно, есть ли более безопасный способ выполнить эту задачу без получения безопасных кодовых ограничений.
Итак, я придумал код ниже, но не смог понять, как извлечь определенную строку из массива (как показано между строками комментария).
Возможно ли передать r-я строка сразу или мне нужно создать другое временное хранилище для r-й строки, а затем передать этот временный вектор через?
(система: Windows-10, VS-2013, C#)
using System;
public class Vector {
public double[] data;
public Vector(double[] data) {
this.data = new double[data.GetLength(0)];
this.data = data;
}
}
public class Matrix {
private int row, col;
public Matrix(double[,] data) {
this.row = data.GetLength(0);
this.col = data.GetLength(1);
Vector[] v = new Vector[this.row];
for (int r = 0; r < this.row; r++) {
// ****** this line below ******
v[r] = new Vector(data[r,???]);
// ****** how to extract the r'th row ******
}
}
static void Main(string[] args) {
double[,] data = { { 9.0, 8.0, 7.0 }, { 5.0, 6.0, 4.0 }, { 3.0, 2.0, 2.0 } };
Matrix A = new Matrix(data);
Console.ReadLine();
}
}
Исправленный код ниже:
using System;
public class Vector {
public double[] data;
public Vector(double[] data) {
this.data = new double[data.GetLength(0)];
this.data = data;
for (int i = 0; i < data.GetLength(0); i++) {
Console.Write("{0: 0.000 }", this.data[i]);
}
Console.WriteLine();
}
}
public class Matrix {
private int row, col;
public Matrix(double[][] data) {
this.row = data.GetLength(0);
this.col = data[0].GetLength(0);
Vector[] v = new Vector[this.row];
for (int r = 0; r < row; r++) {
v[r] = new Vector(data[r]);
}
Console.WriteLine("rows: " + this.row.ToString());
Console.WriteLine("cols: " + this.col.ToString());
}
static void Main(string[] args) {
double[][] data = { new double[] { 9.0, 8.0, 7.0 },
new double[] { 5.0, 6.0, 4.0 },
new double[] { 3.0, 2.0, 2.0 } };
Matrix A = new Matrix(data);
Console.ReadLine();
}
}
'double [,]' создает двумерный массив. Если вам нужен массив массивов (также известный как зубчатый массив), вам нужно использовать 'double [] []'. Подробнее [здесь] (https://msdn.microsoft.com/en-us/library/aa288453 (v = vs.71) .aspx). –
Хорошо! Я заменил многомерный массив зубчатым (не знал разницы между ними, спасибо большое @BJMyers). И теперь, я могу пройти ряд за строкой. Однако на этот раз я застрял при инициализации массива с зубчатым контуром. Кажется, фигурные скобки не будут работать здесь (извините за мой уровень знаний в C#). – ssd