C # Список списков (2D-матрица)

#c# #arrays #list #encapsulation

#c# #массивы #Список #инкапсуляция

Вопрос:

Я пытаюсь реализовать класс 2D-массива, используя список списков. Может кто-нибудь, пожалуйста, помочь мне реализовать функцию get, аналогичную приведенной ниже функции [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]; }
    }
}
  

Ответ №1:

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

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

 T[] columnValues = new T[matrix.Count];
for (int i = 0; i < matrix.Count; i  )
{
    columnValues[i] = matrix[i][x];
}
return columnValues;
  

Ответ №2:

Или: вернуть matrix.Select(z=>z.ElementAtOrDefault(x));

Комментарии:

1. Кстати: используйте this-Метод, как описано выше и ниже.

Ответ №3:

 public IEnumerable<T> this[int x]
{
    get 
    {
          for(int y=0; y<matrix.Count; y  )
                yield return matrix[y][x];            
    }
}
  

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

Комментарии:

1. @kuzyt Очень похоже, да 🙂 Я ошибочно принял матрицу за массив

Ответ №4:

вы должны убедиться, что в каждом списке матрицы есть не менее 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 resu<
        }
    }