Синтаксис для проверки нескольких условий в выражении «if»

Это ситуация:

if count items is either 0,1,5,7,8,9,10 then string = "string one"
if count items is either 2,3,4 then string = "string two"

Я попробовал (внутри cs бритвы)

@if (@item.TotalImages == 1 || 5 || 7 || 8 || 9 || 10)
{
   string mystring = "string one"
}

но я получаю эту ошибку

оператор || не может применяться к операндам типа bool или int

1

7 ответы

У вас неправильный синтаксис для или оператора .

Перейдите к.

@if (@item.TotalImages == 1 || @item.TotalImages == 5)
{
   string mystring = "string one"
}
7
добавлено

Или, возможно,

var accepted = new HashSet(new[] {1, 5, 7, 8, 9, 10});

@if (accepted.Contains(item.TotalImages))
{
   string mystring = "string one"
}
6
добавлено
+1 для использования HashSet вместо списка.
добавлено автор phoog, источник

Метод расширения In может быть синтаксическим сахаром для такой ситуации:

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

Поэтому в основном вместо использования нескольких или operator вы можете просто написать:

@if (@item.TotalImages.In(1, 5, 7, 8, 9, 10)
{
}
4
добавлено
хорошее использование дженериков для этого приложения.
добавлено автор Aaron Thomas, источник
хорошо, бить меня в считанные секунды.
добавлено автор Danny Chen, источник

Присмотритесь к сообщению об ошибке:

оператор || не может применяться к операндам типа bool или int

И ваш код:

@if (@item.TotalImages == 1 || 5)

Вы применяете || оператор в bool (@ item.TotalImages == 1) и int (5). «Правда или 5» не имеет смысла. Также не "ложь или 5"

В принципе, все, что вам нужно сделать, это сделать обе стороны || оператор booleans.

@if (@item.TotalImages == 1 || @item.TotalImages == 5)

Есть (конечно) множество других умных способов сделать это, но это, вероятно, самый прямой.

3
добавлено
+1 для объяснения + решение вместо просто решения
добавлено автор Marjan Venema, источник

Если вы хотите проверить все эти возможности, вы можете получить очень большой оператор if. Способом сделать это с помощью LINQ будет:

@if ((new List{ 0, 1, 5, 7, 8, 9, 10 }).Contains(@item.TotalImages))
{
    string mystring = "string one"
}

Таким образом, вы можете более легко видеть и поддерживать список номеров, которые нужно проверить (или, действительно, передавать их из другого места).

1
добавлено
Метод «Содержит» HashSet более эффективен, чем метод List .
добавлено автор phoog, источник

Я бы использовал переключатель:

@switch (@item.TotalImages)
{
    case 0:
    case 1:
    case 5:
    case 7:
    case 8:
    case 9:
    case 10:
        s = "string one";
        break;
    case 2:
    case 3:
    case 4:
        s = "string two";
        break;
    default:
        throw new Exception("Unexpected image count");
}

Как ни странно, никто не предложил словарь:

private string stringOne = "string one";
private string stringTwo = "string two";

private Dictionary _map = new Dictionary
{
    { 0, stringOne },
    { 1, stringOne },
    { 2, stringTwo },
    { 3, stringTwo },
    { 4, stringTwo },
    { 5, stringOne },
    { 7, stringOne },
    { 8, stringOne },
    { 9, stringOne },
    { 10, stringOne },
}

тогда

@var s = _map[@item.TotalImages];

Такой подход упрощает просмотр, например, того, что вы не обрабатывали случай, когда TotalImages == 6.

0
добавлено
@Holf полагает, что компилятор может сделать это более эффективно, чем я могу. Кроме того, некоторые другие ответы касались ремонтопригодности. Если логика может быть изменена, я бы более склонен использовать Dictionary , поскольку он был бы более гибким.
добавлено автор phoog, источник
Почему вы одобряете предложение switch, а не другие предлагаемые решения? Просто интересно ...
добавлено автор Holf, источник
Спасибо, поняли.
добавлено автор Holf, источник

Между "||" всегда должно быть выражением, которое может быть передано в Boolean (true/false):

@if (@item.TotalImages == 1 || @item.TotalImages == 5 || @item.TotalImages == 7 || @item.TotalImages == 8 || @item.TotalImages == 9 || @item.TotalImages == 10)
    {
       string mystring = "string one"
    }
@else @if(@item.TotalImages == 2 || @item.TotalImages == 3 || @item.TotalImages == 4)
    {
       string mystirng = "string two"
    }
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot