C # Список списков (2D матрица) - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь реализовать класс двумерного массива, используя Список списков.Может кто-нибудь помочь мне реализовать функцию get, аналогичную функции T this [int x, int y] ниже, чтобы получить все элементы в столбце, заданном [int x ,:], где x - столбец.Возврат в виде массива будет в порядке.

public class Matrix<T>
{
    List<List<T>> matrix;

    public Matrix()
    {
        matrix = new List<List<T>>();
    }

    public void Add(IEnumerable<T> row)
    {
        List<T> newRow = new List<T>(row);
        matrix.Add(newRow);
    }

    public T this[int x, int y]
    {
        get { return matrix[y][x]; }
    }
}

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

Поскольку каждое значение, которое вы хотите вернуть, находится в отдельной строке и, следовательно, в отдельной List, вам придется перебирать все списки строк и возвращать элемент x из этих строк.

Количество возвращаемых значений всегда будет равно количеству строк, поэтому вы можете:

T[] columnValues = new T[matrix.Count];
for (int i = 0; i < matrix.Count; i++)
{
    columnValues[i] = matrix[i][x];
}
return columnValues;
2 голосов
/ 12 октября 2011

Или: возвращаемая матрица. Выбрать (z => z.ElementAtOrDefault (x));

1 голос
/ 12 октября 2011
public IEnumerable<T> this[int x]
{
    get 
    {
          for(int y=0; y<matrix.Count; y++)
                yield return matrix[y][x];            
    }
}

У Yielding есть некоторые преимущества по сравнению с созданием массива результатов, поскольку он дает лучший контроль над тем, как используются выходные данные.Например, myMatrix [1] .ToArray () даст вам двойное значение [], тогда как myMatrix [1] .Take (5) .ToArray () будет создавать только двойное значение [5]

.
0 голосов
/ 12 октября 2011

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

    public T[] this[int x]
    {
        get
        {
            T[] result = new T[matrix.Count];
            for (int y = 0; y < matrix.Count; y++)
            {
                result[y] = matrix[y][x];
            }
            return result;
        }
    }
...