Ограничение переполнения значения C # - PullRequest
2 голосов
/ 08 ноября 2011

Мне нужно ограничить значение при переполнении.Я реализовал это следующим образом:

    public static sbyte LimitValueToSByte(this int val)
    {
        if (val > sbyte.MaxValue) return sbyte.MaxValue;
        if (val < sbyte.MinValue) return sbyte.MinValue;
        return (sbyte)val;
    }

Есть ли более элегантный способ?

Это код в критичной ко времени системе, поэтому производительность важна.

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Это похоже на отлично читаемый и корректный код, который вообще не нуждается в улучшении. Это просто название метода. Возможно, используйте ToSbyte вместо LimitValueToSByte.

1 голос
/ 08 ноября 2011

Не могу придумать лучшего способа написания этой функции.

Я бы назвал ее ClampToSByte, так как этот вид операции ограничения обычно называется Clamp.Limit немного менее конкретен и допускает другие граничные условия, такие как обтекание.

Вы должны быть осторожны, если реализуете подобный код для чисел с плавающей точкой.В частности, вам нужно решить, какое поведение вы хотите для NaN с и подписанных нулей.Но, к счастью, нет проблем с интегральными значениями.

0 голосов
/ 23 ноября 2012

Мое новое решение этой проблемы:

public static sbyte Clamp(this int val)
{
    return (sbyte)Math.Max(Math.Min(value, sbyte.MaxValue), sbyte.MinValue);
}
0 голосов
/ 08 ноября 2011

выглядит довольно хорошо для меня.Если вы хотите что-то более элегантное, как насчет общей функции зажима?

public static T Clamp<T>(this T value, T min, T max)
    where T : IComparable<T>
{
    if (value.CompareTo(min) <= 0) return min;
    if (value.CompareTo(max) >= 0) return max;
    return value;
}

(Внимание: я не проверял это.) Вы можете использовать это так:

int a = 42;
sbyte b = (sbyte)a.Clamp(sbyte.MinValue, sbyte.MaxValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...