2015-11-05 6 views
0

У меня есть 2-мерный массив, который я хотел бы вернуть ссылку строки массива в методе, чтобы отразить любые изменения в этой строке в исходном массиве. Прямо сейчас у меня есть следующий метод, но он возвращает новые экземпляры значений из-за пропускаемых парных чисел.Как вернуть ссылку строки double [,]

public double[] GetRowReference(int rowNumber) 
{ 
    double[] output = new double[_allPoints.GetLength(1)]; 
    for (int i = 0; i < _allPoints.GetLength(1); i++) 
    { 
     output[i] = _allPoints[rowNumber, i]; 
    } 
    return output; 
} 

Как вернуть эту строку в качестве ссылки вместо значений?

+0

не возможно. (к сожалению) вам лучше искать другой способ, например, почему бы не работать с массивом 2d напрямую? –

+2

Другим способом является использование массива с jagged, чтобы вы могли возвращать ссылку на внутренние массивы, однако вам нужно изменить часть своей программы. 'double [] [] array = new double [2] []; double [] reference = new [] {4d, 4, 5}; array [1] = reference; reference [1] = 6; ' –

+0

@ M.kazemAkhgary Я пытаюсь написать свой API так, чтобы было легче понять, что означают строки, а значит, свойства, которые ссылаются на данную строку в общем массиве 2d. Я думал о внедрении массивов с зазубринами, но понял, что я что-то упустил с помощью реализации 2d-массива. – PlTaylor

ответ

0

Вы не можете вернуть один размерный массив, в котором доступ к элементу будет доступ к элементу в соответствующей строке другого двухмерного массива.

Самого лучшее, что вы можете сделать, это создать свой собственный тип, который имеет эту логику, и выставляет API одномерного списка (т.е. через IList<T>), в котором необходимо сопоставить каждую операцию в соответствующую операцию на хранимые два размерном список:

public class ArrayRow<T> : IList<T> 
{ 
    private T[,] array; 
    private int row; 
    public ArrayRow(T[,] array, int row) 
    { 
     this.array = array; 
     this.row = row; 
    } 

    public T this[int index] 
    { 
     get 
     { 
      return array[row, index]; 
     } 
     set 
     { 
      array[row, index] = value; 
     } 
    } 

    public int Count 
    { 
     get { return array.GetLength(1); } 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     for (int j = 0; j < array.GetLength(1); j++) 
      yield return array[row, j]; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    //TODO implement remaining IList<T> methods 
} 
Смежные вопросы