I have no idea of how many times I had to write a function do discover the minimum and the maximum value of a sequence.
I just love the way I can do it now, using C#.
public static class EnumerableExtensions
{
public static (T min, T max) MinMax<T>(this IEnumerable<T> source)
where T : IComparable<T>
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
throw new InvalidOperationException("Cannot find min/max of an empty sequence.");
}
var result = (min: iterator.Current, max: iterator.Current);
while (iterator.MoveNext())
{
if (iterator.Current.CompareTo(result.min) < 0) result.min = iterator.Current;
if (iterator.Current.CompareTo(result.max) > 0) result.max = iterator.Current;
}
return result;
}
}
}
Pretty nice, right?!
class Program
{
static void Main(string[] args)
{
var sequence = Enumerable.Range(10, 1000000);
var minmax = sequence.MinMax();
Console.WriteLine($"Min: {minmax.min} Max: {minmax.max}");
}
}
That’s it.