【问题标题】:Compare two values in if [duplicate]比较 if [重复] 中的两个值
【发布时间】:2014-01-09 06:26:09
【问题描述】:

假设我有一个这样的假设:

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

这可以缩短为:

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

我尝试在第二个条件周围加上括号,或者在不应该出现的两个周围加上括号,在整个事情周围加上括号,但它没有通过编译器。

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

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

【问题讨论】:

标签: c# if-statement comparison


【解决方案1】:

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

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))

【讨论】:

  • 应该是forbiddenNumbers吧?
【解决方案2】:

你可以使用这个扩展方法:

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))

【讨论】:

  • 如果menu 为空怎么办?
  • @RGraham:这将按预期工作。如果 menu1 或 menu2 为 null,则扩展方法将返回 true。
【解决方案3】:

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

menu != (menu1 && menu2)

意思是“将菜单与菜单 1 和菜单 2 上的布尔 AND 操作进行比较”。 而

menu != menu1 && menu != menu2

表示“对menu和menu1的比较运算结果和menu和menu2的比较运算结果进行AND运算”。

【讨论】:

  • 布尔与,而非二进制与
【解决方案4】:

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

(menu1 && menu2)

根据变量的值计算为truefalse

如果 menu1menu2 不是布尔值,那么您需要进行比较以产生布尔值,就像您在第一次执行时所做的那样:

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

【讨论】:

    【解决方案5】:

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

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

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

    (相当于如果menu1、menu2和menu都是相同的布尔值)

    但是,如果它们是字符串(或者实际上不是布尔值),那么它就没有意义了。您仍然可以缩短它,但我不建议将它用于 2 项:

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

    【讨论】:

      【解决方案6】:
       (menu1 && menu2)
      

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

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

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

      的操作数

      我认为它不能再被缩短,除非它们都是布尔值,当你可以在 menu1 和 menu2 之间使用XOR operator

      【讨论】:

        【解决方案7】:
        var menusToCheck = new List<Menu> {"abc","def","eee","sdds" };
        if (!menusToCheck .Contains(menu))
        {
         ..spin..
        }
        

        像这样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多