#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<
}
}