Методы 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

admin опубликовано 2009-6-11 Рубрика: Утилитарные классы | Метки: , ,

Ответить

(Ctrl + Enter)