Skip to content

Math.Min<T> Max<T> Clamp<T> #43796

@TonyValenti

Description

@TonyValenti

Background and Motivation

Please make it easier to min/max/clamp any classes.

Proposed API

Right now the Math.Min / Max / Clamp methods only work with a small number of built in data types. A generic version of these methods should be introduced on the Comparer<T> base class.

public T Comparer<T>.Min(T Value1, T Value2);
public T Comparer<T>.Max(T Value1, T Value2);
public T Comparer<T>.Clamp(T Value, T Min, T Max);

public static T Comparer.Min(T Value1, T Value2) => Comparer<T>.Default.Min(Value1, Value2);
public static T Comparer.Max(T Value1, T Value2) => Comparer<T>.Default.Max(Value1, Value2);
public static T Comparer.Clamp(T Value, T Min, T Max) => Comparer<T>.Default.Clamp(Value1, Min, Max);

Example Implementation

    public static class ComparerExtensions {
        public static T Min<T>(this Comparer<T> This, T Value1, T Value2) {
            var ret = This.Compare(Value1, Value2) <= 0
                ? Value1
                : Value2
                ;

            return ret;
        }

        public static T Max<T>(this Comparer<T> This, T Value1, T Value2) {
            var ret = This.Compare(Value1, Value2) >= 0
                ? Value1
                : Value2
                ;

            return ret;
        }

        public static T Clamp<T>(this Comparer<T> This, T Value, T Min, T Max) {
            var ret = Value;
            if (This.Compare(Value, Min) < 0) {
                ret = Min;
            } else if (This.Compare(Value, Max) > 0) {
                ret = Max;
            }

            return ret;
        }
    }

Usage Examples

Comparer.Clamp(MyValue, TimeSpan.Zero, TimeSpan.FromSeconds(30))

Alternative Designs

This could just be ignored.

Risks

None.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions