public static class IEnumerableExtensions { public static T MinBy(this IEnumerable source, Func selector) { T min = default; bool anyValue = false; foreach (var item in source) { if (!anyValue || Comparer.Default.Compare(selector(item), selector(min)) < 0) { min = item; anyValue = true; } } return min; } }