Как можно компактно написать поиск минимума в зубчатом массиве?
Есть массив arr, элементы которого являются массивами DateTime[].
Другими словами arr хранит определенное количество массивов DateTime[], есть index - интекс текущего элемента, он применяется ко всем массивам.
Нужно найти самую раннюю дату среди index+1 элементов во всех массивах DateTime[]. Массивы разных размерностей, и в одном или некоторых может не оказаться index+1 элемента.
DateTime[][] arr = new DateTime[3][];
arr[0] = new DateTime[3];
arr[1] = new DateTime[2];
arr[2] = new DateTime[4];
int index = 0;
int arrIndexInit = 0; //индекс первого массива у которого есть index+1 элемент
for (int i = 0; i < arr.Length; i++)
{
if(index + 1 < arr[i].Length)
{
arrIndexInit = i;
break;
}
}
DateTime nextEarliestDate = arr[arrIndexInit][index + 1];
for (int i = 0; i < arr.Length; i++) //проходим по всем массивам, и сравниваем их дату с минимальной
{
if (index + 1 < arr[i].Length) //если в масиве есть index+1 элемент
{
if (DateTime.Compare(arr[i][index + 1], nextEarliestDate) < 0)
{
nextEarliestDate = arr[i][index + 1];
}
}
}
Ответы (1 шт):
В LINQ уже есть метод находящий минимальное число:
var numbers = new List<int> { 1, 8, 3, 2 };
int minNumber = numbers.Min();
еще можно взять метод minBy для нахождения минимального числа по переменной или проперте у обьектов - пример реализации в MoreLinq
Вообще для обьединения двух списков поиндексно существует такая вещь как Zip. Zip поддерживающий 3 массива есть начиная с .net 6
IEnumerable<(int a1, int a2, int a3)> zip = arr1.Zip(arr2, arr3);
после чего применить Min на каждом наборе результатов и получить минимальную дату по всем 3м спискам сравнива даты в рамках одного индекса по всех массивах.
Ну а если необходимо один минимум из всех (а не поиндексный минимум) - то необходимо воспользоваться flatMap (в шарпе SelectMany) для того что бы сделать из N массивов (вложенных в один массив) в один последовательный массив значених всех 3х массивов, после чего уже находим минимум по этому массиву.
var min = arrayOfArrays.SelectMany(x => x).Min()
