code/KustoCopyConsole/EnumerableHelper.cs (50 lines of code) (raw):

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KustoCopyConsole { internal static class EnumerableHelper { public static T ArgExtremum<T, C>( this IEnumerable<T> enumerable, Func<C, C, int> comparer, Func<T, C> selector) { T? extremumItem = default; C? extremumValue = default; foreach (var item in enumerable) { if (extremumItem == null || extremumValue == null || comparer(selector(item), extremumValue) > 0) { extremumItem = item; extremumValue = selector(item); } } if (extremumItem == null) { throw new InvalidOperationException("Enumerable is empty"); } return extremumItem; } public static T ArgMin<T>(this IEnumerable<T> enumerable, Func<T, long> selector) { return ArgExtremum(enumerable, (i1, i2) => -i1.CompareTo(i2), selector); } public static T ArgMax<T>(this IEnumerable<T> enumerable, Func<T, long> selector) { return ArgExtremum(enumerable, (i1, i2) => i1.CompareTo(i2), selector); } public static T ArgMin<T>(this IEnumerable<T> enumerable, Func<T, DateTime> selector) { return ArgExtremum(enumerable, (d1, d2) => -d1.CompareTo(d2), selector); } public static T ArgMax<T>(this IEnumerable<T> enumerable, Func<T, DateTime> selector) { return ArgExtremum(enumerable, (d1, d2) => d1.CompareTo(d2), selector); } } }