using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public static class CollectionExtensions { // https://stackoverflow.com/a/3188835 public static T MaxBy(this IEnumerable items, Func selector) { if (!items.Any()) { throw new InvalidOperationException("Empty input sequence"); } var comparer = Comparer.Default; T maxItem = items.First(); U maxValue = selector(maxItem); foreach (T item in items.Skip(1)) { // Get the value of the item and compare it to the current max. U value = selector(item); if (comparer.Compare(value, maxValue) > 0) { maxValue = value; maxItem = item; } } return maxItem; } public static T MinBy(this IEnumerable items, Func selector) { if (!items.Any()) { throw new InvalidOperationException("Empty input sequence"); } var comparer = Comparer.Default; T maxItem = items.First(); U maxValue = selector(maxItem); foreach (T item in items.Skip(1)) { // Get the value of the item and compare it to the current max. U value = selector(item); if (comparer.Compare(value, maxValue) < 0) { maxValue = value; maxItem = item; } } return maxItem; } } public static class AsyncAwaitExtensions { public static async void WrapAwait(this Task task) { await task; } }