C# 比较if中的两个值

C# 比较if中的两个值,c#,if-statement,comparison,C#,If Statement,Comparison,假设我有一个假设,它是这样的: if(condition1 != asd && menu != menu1 && menu != menu2) if (condition1 != asd && !menu.EqualsAny(menu1, menu2)) 是否可以将其缩短为: if(condition1 != asd && menu != (menu1 && menu2)) 我试着在第二个条件周围加上括号,或者

假设我有一个假设,它是这样的:

if(condition1 != asd && menu != menu1 && menu != menu2)
if (condition1 != asd && !menu.EqualsAny(menu1, menu2))
是否可以将其缩短为:

if(condition1 != asd && menu != (menu1 && menu2))
我试着在第二个条件周围加上括号,或者在两个不应该的条件周围,或者在整个条件周围,但是它没有通过编译器

这样可以缩短第二个条件吗?还是有更好的方法


PS。我不知道该怎么称呼它,所以请随意编辑标题。

不,你不能像第二句话那样做。因为

menu != (menu1 && menu2)
这意味着“将菜单与menu1和menu2上的布尔AND运算进行比较”。 当


表示“对菜单和菜单1上的比较操作以及菜单和菜单2上的比较操作的结果应用和操作”。

不,您不能像第二条语句那样执行此操作。因为

menu != (menu1 && menu2)
这意味着“将菜单与menu1和menu2上的布尔AND运算进行比较”。 当


表示“将AND运算应用于menu和menu1上的比较运算结果以及menu和menu2上的比较运算结果”。

逻辑运算符产生布尔结果。因此:

(menu1 && menu2)
根据变量的值计算为
true
false

如果
menu1
menu2
不是布尔值,则需要进行比较以生成布尔值,就像您在第一步中所做的那样:

if(condition1 != asd && menu != menu1 && menu != menu2)

逻辑运算符产生布尔结果。因此:

(menu1 && menu2)
根据变量的值计算为
true
false

如果
menu1
menu2
不是布尔值,则需要进行比较以生成布尔值,就像您在第一步中所做的那样:

if(condition1 != asd && menu != menu1 && menu != menu2)

您尚未指定
菜单的数据类型,答案可能取决于此

例如,如果
菜单
menu1
menu2
都是布尔值,那么这可能有一定的逻辑意义

if(menu != (menu1 && menu2))
(如果menu1、menu2和menu都是相同的布尔值,则等于)

然而,如果它们是字符串(或者实际上是布尔以外的任何东西),那么它就没有意义。您仍然可以将其缩短,但我不建议将其用于以下两项:

var menuItems = new string[]{menu1,menu2}
if(condition1 != asd &&  menuItems.Contains(menu))
{
   ...
}

您尚未指定
菜单的数据类型,答案可能取决于此

例如,如果
菜单
menu1
menu2
都是布尔值,那么这可能有一定的逻辑意义

if(menu != (menu1 && menu2))
(如果menu1、menu2和menu都是相同的布尔值,则等于)

然而,如果它们是字符串(或者实际上是布尔以外的任何东西),那么它就没有意义。您仍然可以将其缩短,但我不建议将其用于以下两项:

var menuItems = new string[]{menu1,menu2}
if(condition1 != asd &&  menuItems.Contains(menu))
{
   ...
}

想象一下,如果你在比较数字:

if (myNumber != 5 && myNumber != 10)
您可以先将要比较的数字添加到列表中,然后使用
.Contains()

var-dennumbers=新列表{5,10};
如果(!禁止编号.包含(myNumber))
我看不出有任何理由不能对菜单执行相同的操作,因为您只是在比较对象引用。(我不确定这里的类型,所以我只选择了“菜单”。)

var menusToCheck=新列表{menu1,menu2};
如果(!allowedMenus.Contains(菜单))

想象一下,如果你在比较数字:

if (myNumber != 5 && myNumber != 10)
您可以先将要比较的数字添加到列表中,然后使用
.Contains()

var-dennumbers=新列表{5,10};
如果(!禁止编号.包含(myNumber))
我看不出有任何理由不能对菜单执行相同的操作,因为您只是在比较对象引用。(我不确定这里的类型,所以我只选择了“菜单”。)

var menusToCheck=新列表{menu1,menu2};
如果(!allowedMenus.Contains(菜单))

您可以使用此扩展方法:

public static class EqualsAnyExtension
{
    public static bool EqualsAny<T>(this T value, params T[] items)
    {
        return items.Contains(value);
    }
}

您可以使用此扩展方法:

public static class EqualsAnyExtension
{
    public static bool EqualsAny<T>(this T value, params T[] items)
    {
        return items.Contains(value);
    }
}

menu1和menu2都必须是bool类型,否则会抛出

CS0019:运算符“&&”不能应用于类型为的操作数

我认为它不能再缩短了,除非它们都是布尔值,这时可以在menu1和menu2之间使用

var menusToCheck = new List<Menu> {"abc","def","eee","sdds" };
if (!menusToCheck .Contains(menu))
{
 ..spin..
}

menu1和menu2都必须是bool类型,否则会抛出

CS0019:运算符“&&”不能应用于类型为的操作数

我认为它不能再缩短了,除非它们都是布尔值,这时您可以在menu1和menu2之间使用。

var menusToCheck=new List{“abc”、“def”、“eee”、“sdds”};
var menusToCheck = new List<Menu> {"abc","def","eee","sdds" };
if (!menusToCheck .Contains(menu))
{
 ..spin..
}
如果(!menusToCheck.Contains(菜单)) { 快速旋转 }
像这样。

var menusToCheck=新列表{“abc”、“def”、“eee”、“sdds”};
如果(!menusToCheck.Contains(菜单))
{
快速旋转
}

像这样。

布尔and,不是二进制and,不是二进制and,你可以使用这个线程:你可以使用这个线程:应该是
禁止数字
,对吗?应该是
禁止数字
,对吗?如果
菜单
为空怎么办?@RGraham:这将按预期工作。如果menu1或menu2为null,则扩展方法将返回true。如果
菜单
为null会怎么样?@RGraham:这将按预期工作。如果menu1或menu2为null,则扩展方法将返回true。