假设我有这样的话:
if(condition1 != asd && menu != menu1 && menu != menu2)
这可以简化为:
if(condition1 != asd && menu != (menu1 && menu2))
我尝试将括号放在第二个条件周围,或者围绕它不应该的两个条件,并围绕整个事情,但它不会通过编译器。
这样可以缩短第二种情况吗?或者有更好的方法吗?
PS 即可。我不知道该怎么称呼它,所以随时编辑标题。
答案 0 :(得分:5)
想象一下,如果你要比较数字:
if (myNumber != 5 && myNumber != 10)
您可以先将要比较的数字添加到列表中,然后使用.Contains()
:
var forbiddenNumbers = new List<int> { 5, 10 };
if (!forbiddenNumbers.Contains(myNumber))
我没有看到任何理由你不能对你的菜单做同样的事情,因为你只是比较对象引用。 (我不确定这里的类型是什么,所以我只选择了“菜单”。)
var menusToCheck = new List<Menu> { menu1, menu2 };
if (!allowedMenus.Contains(menu))
答案 1 :(得分:1)
您可以使用此扩展方法:
public static class EqualsAnyExtension
{
public static bool EqualsAny<T>(this T value, params T[] items)
{
return items.Contains(value);
}
}
像这样使用:
if (condition1 != asd && !menu.EqualsAny(menu1, menu2))
答案 2 :(得分:0)
不,你不能像第二个声明那样做。因为
menu != (menu1 && menu2)
意味着“在menu1和menu2上比较菜单与布尔AND操作”。 而
menu != menu1 && menu != menu2
表示“对菜单和菜单1上的比较操作结果应用AND操作,菜单和菜单2上的比较操作”。
答案 3 :(得分:0)
逻辑运算符产生布尔结果。因此:
(menu1 && menu2)
根据变量的值来评估true
或false
。
如果menu1
或menu2
不是布尔值,那么您需要进行比较以产生布尔值,就像您第一次做的那样:
if(condition1 != asd && menu != menu1 && menu != menu2)
答案 4 :(得分:0)
您尚未指定menu
的数据类型,答案可能取决于此。
例如,如果menu
,menu1
和menu2
都是布尔值,那么这可能会产生一定的逻辑意义
if(menu != (menu1 && menu2))
(相当于menu1,menu2和menu都是相同的布尔值)
然而,如果它们是字符串(或实际上除了布尔值之外的任何东西),那么它就没有意义了。你仍然可以缩短它,但我不推荐它用于2个项目:
var menuItems = new string[]{menu1,menu2}
if(condition1 != asd && menuItems.Contains(menu))
{
...
}
答案 5 :(得分:0)
(menu1 && menu2)
在
if(condition1 != asd && menu != (menu1 && menu2))
menu1和menu2都需要是bool类型,否则抛出
CS0019:运营商'&amp;&amp;'不能应用于
类型的操作数我认为除非所有这些都是布尔值,否则不能再缩短,只需在menu1和menu2之间使用XOR operator。
答案 6 :(得分:0)
var menusToCheck = new List<Menu> {"abc","def","eee","sdds" };
if (!menusToCheck .Contains(menu))
{
..spin..
}
喜欢这个。