Как можно компактно написать поиск минимума в зубчатом массиве?

Есть массив 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 шт):

Автор решения: Andrew_STOP_RU_AGRESSION_IN_UA

В 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()
→ Ссылка