Сокращение для условных заявлений - PullRequest
4 голосов
/ 22 сентября 2011

Я ищу способ написать что-то вроде этого:

if (product.Category.PCATID != 10 && product.Category.PCATID != 11 && product.Category.PCATID != 16) {   }

Сокращенным способом, как показано ниже, который, конечно, не работает:

if (product.Category.PCATID != 10 | 11 | 16) {   }

Так есть ли вообще способ сделать что-то подобное?

Ответы [ 7 ]

6 голосов
/ 22 сентября 2011

Да - вы должны использовать набор:

private static readonly HashSet<int> FooCategoryIds
    = new HashSet<int> { 10, 11, 16 };

...

if (!FooCategoryIds.Contains(product.Category.PCATID))
{
}

Конечно, вы можете использовать список, массив или в основном любую коллекцию - и для небольших наборов идентификаторов не имеет значения, какой вы используете ... но я бы лично использовал HashSet, чтобы показать, что я действительно меня интересует только «набор», а не порядок.

5 голосов
/ 22 сентября 2011

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

    public static bool In<T>(this T source, params T[] list)
    {
        return list.Contains(source);
    }

И назвать его как:

  if (!product.Category.PCATID.In(10, 11, 16)) {  }
3 голосов
/ 22 сентября 2011

не совсем ярлык, но, возможно, это то, что вам нужно.

var list = new List<int> { 10, 11, 16 };
if(!list.Contains(product.Category.PCATID))
{
  // do something
}
2 голосов
/ 22 сентября 2011

Ну ... я думаю, что сокращенная версия будет if(true), потому что если PCATID == 10, то это! = 11 и! = 16, поэтому все выражение будет true.
.То же самое касается PCATID == 11 и PCATID == 16.
. И для любого другого числа все три условия: true.
==> Выражение всегда будет true.

.другие ответы действительны, только если вы действительно имели в виду это:

if (product.Category.PCATID != 10 && 
    product.Category.PCATID != 11 && 
    product.Category.PCATID != 16) {   }
1 голос
/ 22 сентября 2011
if (!new int[] { 10, 11, 16 }.Contains(product.Category.PCATID))
{
}

Добавление using System.Linq в начало вашего класса или .Contains приводит к ошибке компиляции.

1 голос
/ 22 сентября 2011

Вы можете сделать что-то подобное:

List<int> PCATIDCorrectValues = new List<int> {10, 11, 16};

if (!PCATIDCorrectValues.Contains(product.Category.PCATID)) {
    // Blah blah
}
0 голосов
/ 19 февраля 2015

Упростите с switch:

switch(product.Category.PCATID) {
    case 10:
    case 11:
    case 16: {
        // Do nothing here
        break;
    }
    default: {
        // Do your stuff here if !=10, !=11, and !=16
        //    free as you like
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...