public static IEnumerable <M> GetNSmallest <M>(this IComparer <M> g, IEnumerable <M> source, int n) { if (n < 0) { return(g.GetNLargest(source, -n)); } if (n == 0) { return(Enumerable.Empty <M>()); } var sourceList = source.ToList(); n = Math.Min(sourceList.Count, n); var resSet = sourceList.Take(n).ToList(); var currentMax = g.Max(resSet); foreach (var t in sourceList.Skip(n)) { if (g.Compare(t, currentMax) >= 0) { continue; } resSet.Remove(currentMax); resSet.Add(t); currentMax = g.Max(resSet); } return(resSet.OrderBy(i => i, g)); }
/// <summary> /// Clamps <paramref name="value"/> to a given inclusive range between <paramref name="min"/> and <paramref name="max"/>. /// </summary> /// <param name="_this">The <see cref="IComparer"/> used for comparisons.</param> /// <param name="value"></param> /// <param name="min">The lower border of the range. Is considered lower than <paramref name="_this"/> if null.</param> /// <param name="max">The upper border of the range. Is considered higher than <paramref name="_this"/> if null.</param> /// <returns>The clamped version of <paramref name="value"/>.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="_this"/> is null.</exception> /// <example> /// <code> /// var result = new MyComparer().Clamp(value, min, max); /// </code> /// </example> public static Object Clamp(this IComparer _this, Object value, Object min, Object max) { Throw.If.Object.IsNull(_this, nameof(_this)); Throw.If.Object.IsNull(value, nameof(value)); if (min != null && max != null && _this.IsGreaterThan(min, max)) { return(_this.Clamp(value, max, min)); } Object result = value; if (min != null) { result = _this.Max(value, min); } if (max != null) { result = _this.Min(result, max); } return(result); }
/// <summary> /// Clamps <paramref name="value"/> to a given inclusive range between <paramref name="min"/> and <paramref name="max"/>. /// </summary> /// <typeparam name="T">The type of the objects.</typeparam> /// <param name="_this">The <see cref="IComparer{T}"/> used for comparisons.</param> /// <param name="value"></param> /// <param name="min">The lower border of the range. Is considered lower than <paramref name="_this"/> if null.</param> /// <param name="max">The upper border of the range. Is considered higher than <paramref name="_this"/> if null.</param> /// <returns>The clamped version of <paramref name="value"/>.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="_this"/> is null.</exception> /// <example> /// <code> /// var result = new MyComparer().Clamp(value, min, max); /// </code> /// </example> public static T Clamp <T>(this IComparer <T> _this, T value, T min, T max) { Throw.If.Object.IsNull(_this, nameof(_this)); Throw.If.Object.IsNull(value, nameof(value)); if (min != null && max != null && _this.IsGreaterThan(min, max)) { return(_this.Clamp(value, max, min)); } T result = value; if (min != null) { result = _this.Max(value, min); } if (max != null) { result = _this.Min(result, max); } return(result); }
/// <summary> /// Returns greatest item in sequence according to comparer, preferring earlier elements. /// </summary> public static Maybe <A> MaxByMaybe <A>(this IEnumerable <A> xs, IComparer <A> comparer) => xs.Aggregate(None <A>(), (m, x2) => m.Select(x1 => comparer.Max(x1, x2)).Or(Some(x2)));
/// <summary> /// The monoid used for <see cref="PriorityQueue{P,T}"/>. /// </summary> public static Monoid <P> PriorityM <P>(P min, IComparer <P> comparer) { return(new Monoid <P>(min, (x, y) => comparer.Max(x, y))); }
public static M Max <M>(this IComparer <M> g, params M[] source) { return(g.Max(source.ToList())); }