C# Поиск максимума/минимума в IEnumerable

Вопрос следующий - как работает Max/Min в Linq? То есть, мы ведь не можем вытащить первый элемент по индексу из коллекции(т.к индексирование в коллекции не реализовано) и присвоить его в нашу переменную, а потом, пробегая по циклу, сравнивать её. Очевидно, что можно сделать это через перегонку коллекции в тот же массив, но есть ли другой способ? Без создания массива/листа и пробега уже по нему?


Ответы (1 шт):

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

Ответ найден - можно организовать метод расширения и вызвать enumerator.MoveNext(), если вернёт false, то дропаем exception, иначе присваиваем enumerator.Current. Позже, пробегаем по всей коллекции, используя всё тот же MoveNext() и сравниваем.

public static class IEnumerableExtension
    {
        public static T MyMax<T>(this IEnumerable<T> source) 
            where T : IComparable
        {
            var enumerator = source.GetEnumerator();
            if (!enumerator.MoveNext())
                throw new InvalidOperationException();
            var max = enumerator.Current;
            while (enumerator.MoveNext())
                max = max.CompareTo(enumerator.Current) < 0 ? enumerator.Current : max;
            return max;
        }
    }
→ Ссылка