Методы Between<T>
Не секрет, что почти в каждой программе, оперирующей с числовой информацией, приходится производить проверку принадлежности различных значений допустимым интервалам. Зачастую, такие выражения в операторах сравнения имеют довольно громоздкий вид, например:
C#: | Select code |
if (MyNamespace.MyClass.Property1 >= min_value &&
MyNamespace.MyClass.Property1 <= max_value)
Чтобы сохранить читабельность вашего кода, предлагаю использовать следующие статические generic-методы (в данном случае все они помещены в статический же класс Utils):
C#: | Select code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | public static class Utils { #region Методы Between<T> /// <summary> /// Определить принадлежность значения <paramref name="x"/> интервалу [<paramref name="a"/>; <paramref name="b"/>] /// или [<paramref name="b"/>; <paramref name="a"/>]. /// </summary> /// <typeparam name="T">Любой сравнимый тип (<see cref="IComparable<T>"/>).</typeparam> /// <param name="x">Значение.</param> /// <param name="a">Начало интервала.</param> /// <param name="b">Конец интервала.</param> /// <returns>true - если значение принадлежит интервалу, иначе - false.</returns> public static bool Between<T>(T x, T a, T b) where T : IComparable<T> { return a.CompareTo(b) <= 0 ? x.CompareTo(a) >= 0 && x.CompareTo(b) <= 0 : x.CompareTo(a) <= 0 && x.CompareTo(b) >= 0; } /// <summary> /// Определить принадлежность значения <paramref name="x"/> интервалу (<paramref name="a"/>; <paramref name="b"/>) /// или (<paramref name="b"/>; <paramref name="a"/>). /// </summary> /// <typeparam name="T">Любой сравнимый тип (<see cref="IComparable<T>"/>).</typeparam> /// <param name="x">Значение.</param> /// <param name="a">Начало интервала.</param> /// <param name="b">Конец интервала.</param> /// <returns>true - если значение принадлежит интервалу, иначе - false.</returns> public static bool BetweenStrict<T>(T x, T a, T b) where T : IComparable<T> { return a.CompareTo(b) <= 0 ? x.CompareTo(a) > 0 && x.CompareTo(b) < 0 : x.CompareTo(a) < 0 && x.CompareTo(b) > 0; } /// <summary> /// Определить принадлежность значения <paramref name="x"/> интервалу [<paramref name="a"/>; <paramref name="b"/>]. /// </summary> /// <typeparam name="T">Любой сравнимый тип (<see cref="IComparable<T>"/>).</typeparam> /// <param name="x">Значение.</param> /// <param name="a">Начало интервала.</param> /// <param name="b">Конец интервала.</param> /// <returns>true - если значение принадлежит интервалу, иначе - false.</returns> public static bool BetweenOrdered<T>(T x, T a, T b) where T : IComparable<T> { return x.CompareTo(a) >= 0 && x.CompareTo(b) <= 0; } /// <summary> /// Определить принадлежность значения <paramref name="x"/> интервалу (<paramref name="a"/>; <paramref name="b"/>). /// </summary> /// <typeparam name="T">Любой сравнимый тип (<see cref="IComparable<T>"/>).</typeparam> /// <param name="x">Значение.</param> /// <param name="a">Начало интервала.</param> /// <param name="b">Конец интервала.</param> /// <returns>true - если значение принадлежит интервалу, иначе - false.</returns> public static bool BetweenOrderedStrict<T>(T x, T a, T b) where T : IComparable<T> { return x.CompareTo(a) > 0 && x.CompareTo(b) < 0; } #endregion } |
С использованием данного класса, предыдущий пример будет выглядеть так:
C#: | Select code |
if (Utils.Between(MyNamespace.MyClass.Property1, min_value, max_value))
Предлагаемые методы будут работать не только с базовыми типами, но и с любыми типами, реализующими интерфейс System.IComparable<T>.
Обсуждение на форуме: http://usings.ru/forum/viewtopic.php?t=5