2015-12-18 3 views
2

примечание: комментарий 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(); 
    } 
} 
+4

'double [,]' создает двумерный массив. Если вам нужен массив массивов (также известный как зубчатый массив), вам нужно использовать 'double [] []'. Подробнее [здесь] (https://msdn.microsoft.com/en-us/library/aa288453 (v = vs.71) .aspx). –

+0

Хорошо! Я заменил многомерный массив зубчатым (не знал разницы между ними, спасибо большое @BJMyers). И теперь, я могу пройти ряд за строкой. Однако на этот раз я застрял при инициализации массива с зубчатым контуром. Кажется, фигурные скобки не будут работать здесь (извините за мой уровень знаний в C#). – ssd

ответ

1

Ну, вы хотите, чтобы сделать класс массива и acess как один? Сделайте индекс . what is an indexer? - это способ сделать ваш класс доступным, как массив.

Посмотрите на приведенную ссылку, я помогу вам в вашем конкретном случае.

public class Vector { 

public double[] data; 
public double this[int i] 
{ 
    get 
    { 
     // This indexer is very simple, and just returns or sets 
     // the corresponding element from the internal array. 
     return data[i]; 
    } 
    set 
    { 
     data[i] = value; 
    } 
} 
public Vector(double[] data) { 
    this.data = new double[data.GetLength(0)]; 
    this.data = data; 
} 
} 

когда он определен как так, это вполне допустимо:

double elementArray = new double[data.GetLength(1)]; // declaring an array, the size of the second dimention of the data array. 
for(int i =0; i<data.GetLength(1);i++) 
{ 
elementArray[i] = data[r,i]; // adding all the elements to the list 
} 
v[r] = new Vector(elementArray); 

EDIT: комментарий BJ Майерс является правильным, этим решение отлично работает для неровного массива тоже, но убедитесь, что вы заявляете это правильно, как он упомянул.

EDIT 2: Использование списка бессмысленно здесь, изменило растяжение на массив.

+0

исправить вашу опечатку здесь 'v [r] = new Vector (ElementList.toArray());' it '.ToArray() 'not'.toArray() ' – MethodMan

+0

@MethodMan Спасибо, я изменил его на массив вместо списка. –

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