Там должен так или иначе использовать LINQ для получения максимума каждого столбцы для двумерных матриц?
Предположите, что у меня есть следующее:
var arrays = new double[5,100]();
Я хочу получить максимум arrays[0,:]
, arrays[1,:]
.... arrays[4,:]
. Как использовать LINQ, чтобы сделать это?
Я мог иметь, используют такой метод
public double GetMax(double[,] arr, int rowIndex)
{
var colCount = arr.GetLength(1);
double max = 0.0;
for(int i=0; i<colCount; i++)
{
max=Math.Max(Math.Abs(arr[rowIndex, i]), max);
}
return max;
}
Но я предпочел бы более сжатые способы сделать вещи.
Я полагаю, вы всегда можете использовать Enumerable.Range
как компактная форма индексированного доступа:
public static double GetMax(double[,] arr, int rowIndex)
{
return (from col in Enumerable.Range(0, arr.GetLength(1))
select arr[rowIndex, col]).Max();
}
И если вы хотите получить это для всех строк:
public static double[] GetMaxForAllRows(double[,] arr, int rowIndex)
{
return (from row in Enumerable.Range(0, arr.GetLength(0))
let cols = Enumerable.Range(0, arr.GetLength(1))
select cols.Max(col => arr[row, col])).ToArray();
}
Вы можете использовать вложенные операторы from. Таким образом выполняется итерация по всему массиву с переменными диапазона, представляющими соответствующую позицию столбца / строки в таблице. Для каждого из чисел вы хотите проверить, является ли он новым максимумом в его строке или в его столбце.
LINQ не имеет методов, охватывающих многомерные массивы.
Однако, если вы можете преобразовать его в список или, может быть, сверните свои собственные расширения.
Я не думаю, что есть встроенный способ получить строку из многомерного массива. Однако вы можете написать метод расширения:
public static IEnumerable<T> Row<T>(this T[,] array, int rowIndex)
{
var colCount = array.GetLength(1);
for(int i=0; i<colCount; i++)
{
yield return arr[rowIndex, i];
}
}
А затем просто используйте «обычный» LINQ:
var max = array.Row(i).Max();