2017-02-15 7 views
2

Я хочу напечатать строку моего двумерного массива с string.Join(), и я не смог найти способ сделать это эффективно. Конечно, я мог бы сделать это с помощью простого цикла, но было бы интересно узнать, есть ли способ сделать это.String.join на одном измерении двумерного массива

EDIT Я говорю о нормальном многомерном массиве:

int[,] multidimensionalArray= new int[,]; 
+0

Как вы объявили свой массив - 'int [,]' или 'int [] []'? – dana

+1

@dana исправил это. – SuperMinefudge

ответ

2

Не знаю, если вы считаете это более эффективным и читаемым, чем for цикла, но вы можете сделать это:

string s = string.Join(separator, 
         Enumerable.Range(0, multidimentionalarray.GetLength(1)) 
           .Select(column => multidimentionalarray[row, column])); 
+0

ya, если это единственный способ сделать это плохо придерживаться цикла for: D – SuperMinefudge

+0

Не будет ли размер 0 дать вам строку, а не колонку в этом случае? – itsme86

+1

@ itsme86 вправо, смешал его. зафиксировал его, thx. –

3

Невозможно изолировать строку из надлежащего 2D-массива. Если бы это был зубчатый массив, тогда решение было бы очевидно.

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

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

Вы можете добавить простой метод расширения для этой цели, и таким образом поставить всю проблему под ковер:

public static class ArrayExtensions 
{ 
    public static IEnumerable<T> GetRow<T>(this T[,] array, int rowIndex) 
    { 
     int columnsCount = array.GetLength(1); 
     for (int colIndex = 0; colIndex < columnsCount; colIndex++) 
      yield return array[rowIndex, colIndex]; 
    } 
} 

Это даст вам возможность обратиться только одну строку:

IEnumerable<int> row = array.GetRow(1); 

Например, можно напечатать одну строку из матрицы в одной строке кода:

Console.WriteLine(string.Join(", ", array.GetRow(1).ToArray())); 
+0

Очень интересно это может пригодиться вам очень благодарно.: D – SuperMinefudge

3

Ответ Зорана Хорвата хорош, и это то, что я сделал бы, если бы все, что мне нужно было сделать, это прочитать массив.

Если необходимо также, чтобы написать массив, вы могли бы сделать что-то вроде этого:

struct ArrayRow<T> // Consider implementing IEnumerable<T> 
{ 
    T[,] array; 
    int row; 
    public ArrayRow(T[,] array, int row) 
    { 
    this.array = array; 
    this.row = row; 
    } 
    public T this[int i] 
    { 
    get { return this.array[this.row, i]; } 
    set { this.array[this.row, i] = value; } 
    } 
    public int Length 
    { 
    get { return this.array.GetLength(1); } 
    } 
    public IEnumerable<T> Items() 
    { 
    int c = this.Length; 
    for (int i = 0; i < c; ++i) 
     yield return this[i]; 
    } 
} 

static class Extensions 
{ 
    public static ArrayRow<T> GetRow<T>(this T[,] array, int row) 
    { 
    return new ArrayRow<T>(array, row); 
    } 
} 

И теперь у вас есть что-то, что выглядит как одномерный массив, который на самом деле пишет для вашего двумерного массива:

var myRow = myArray.GetRow(10); 
myRow[20] += 30; 
string.Join(",", myRow.Items()); 

И так далее.