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