Стараясь быть максимально кратким с C # - PullRequest
1 голос
/ 11 января 2012

Я ищу более краткий способ выражения следующего теста в C #, где x - это обнуляемое целое

Английский: если x имеет значение AND y> x, тогда что-то делаем

C #, чтобы сделать более кратко:

if(x.HasValue && y > x)

Аналогично, если бы я хотел по умолчанию обнуляемое логическое значение (x) равным false, я мог бы написать:

if(x ?? false)
{
    //x is true
}
else
{
    //x is either null or false
}

вместо:

if(x.HasValue() && x == true)

Большое спасибо

Ответы [ 5 ]

11 голосов
/ 11 января 2012

y > x должно быть достаточно.

0 >= (int?)null // false
0 <= (int?)null // false

(OTOH, я был укушен этим поведением, когда я думал, что что-то будет «больше, чем» null. В этих случаях y > (x ?? 0) или подобноеможет быть полезным.)

Из комментария Бена Фойгта о Использование типов Nullable :

При выполнении сравнения с типами Nullable, значение одного из типов, допускающих значение NULL, равно NULL, а другому - нет, все сравнения оцениваются как ложные, кроме! = (не равно). Важно не предполагать, что, поскольку конкретное сравнение возвращает false, противоположный случайвозвращает true.

Счастливого кодирования.

3 голосов
/ 11 января 2012

Хотя может быть способ сделать это заявление более кратким, я бы избежал его.Показанное вами использование довольно идиоматично и проясняет ваши намерения.Опора на поведение операторов неравенства, допускающих обнуляемость (как в ответе @ pst), может привести к неправильному пониманию кода, а также преуменьшить тот факт, что переменная может быть обнуляемой.Я бы придерживался того, что у вас есть.

3 голосов
/ 11 января 2012

if(x.HasValue && y > x) довольно кратко, не говоря уже о ясности.Обходные пути были бы несколько надуманными.Обратите внимание:

if ((x ?? (y + 1)) < y)

Как отмечает pst, на самом деле вам не нужен вызов HasValue здесь.Но для ясности, возможно, было бы неплохо включить его.

1 голос
/ 11 января 2012

Вы можете использовать метод расширения.

public static class IntegerExtensions
{
    public static bool IsLargerThan(this int? number, int numberToCompare)
    {
        return number.HasValue && number > numberToCompare;
    }
}

...

// Usage:

int? val1 = 15;
int val2 = 10;

if (val1.IsLargerThan(val2))
{
    // Do Something
}
0 голосов
/ 11 января 2012

Вы пробовали метод GetValueOrDefault () ?

Если x равен int?, то ваш первый оператор if может быть переписан как if (x.GetValueOrDefault() > y).Если x равен bool?, его можно просто переписать как if(x.GetValueOrDefault()).

...