C#。如果(a ==(b或c或d))。可能吗?

时间:2010-07-14 08:04:50

标签: c# .net

还有另一种写这样的方式:

if (a == x || a == y || a == z)

我发现的一种方法是这样做:

if( new [] {x,y,z}.Contains(a))

还有其他好方法吗?

11 个答案:

答案 0 :(得分:63)

我经常使用模仿SQL IN的扩展方法:

public static bool IsIn<T>(this T obj, params T[] collection) {
   return collection.Contains(obj);
}

我可以这样做

if(a.IsIn(b, c, d)) { ... }

答案 1 :(得分:12)

你有经典的开关声明:

switch(a) {
    case x:
    case y:
    case z:
        // Do stuff
        break;
}

答案 2 :(得分:6)

只是为了好玩:

using System;

static class Program {

    static bool In(this object obj, params object[] values) {
        foreach (object value in values) {
            if (obj.Equals(value)) {
                return true;
            }
        }
        return false;
    }

    static void Main(string[] args) {
        bool test1 = 3.In(1, 2, 3);
        bool test2 = 5.In(1, 2, 3);
    }
}

但我真的认为最佳方式是编写普通支票

if(a == x || a == y || a == z)

每个人都会立即明白它的作用。

答案 3 :(得分:5)

您的解决方案将其重写为

if( new [] {x,y,z}.Contains(a))

不是一个好的举动。

您采用了一种简单有效的逻辑运算,每个程序员都能轻松理解并且包含短路逻辑以加快速度,而您生成的代码需要一点时间才能理解,哪些效率要低得多。< / p>

如果你不试图“聪明”,有时你的同事们会更喜欢它!

答案 4 :(得分:5)

考虑 a == x y z 评估缓慢的情况,昂贵的功能。

  • if(a == x || a == y || a == z)中,您可以获得短路|| - 运算符,因此 y z 将不会被评估。
  • 如果您使用new[] { x, y, z } - y 制作数组, z 将每次评估

如果有一个优雅的语法来创建延迟评估的序列(.Contains()),那么使用IEnumerable<T>的'技巧'会更有用。即yield return x; yield return y;...之类的内容,但内联且更短。

答案 5 :(得分:3)

那么,您是否希望将包含短路优化的简单,高效的语言结构替换为可能会抛出异常的速度慢得多的东西?

但是,如果要比较的项目数量不固定,即在运行时它可能是t,u,v,w,x,y,z等等,那么Collection.Contains方法是唯一的选择,但是你要传递集合对象而不是单个值,所以几乎没有内存分配。

如果您有大量项目要比较'a',但项目在运行时不是动态的,那么switch语句可能更合适。

答案 6 :(得分:2)

为什么还需要另一种方式?由于它不是功能问题,我猜想重点是提高可读性。 如果您有一些具有有意义名称的变量,那么使用==进行比较会更具可读性。如果您有更多内容,则可以对其他示例中的列表使用Contains。 另一种方法是与枚举标志进行比较:

[Flags]
public enum Size
{
    Small = 1,
    Medium = 2,
    Large = 4
}

然后找出mySizeSmall中是否有Medium

selectedSizes = Size.Small | Size.Medium;
mySize = Size.Small;
if (mySize & selectedSizes)
{
  ... 
}

答案 7 :(得分:2)

有趣的事实,从 C#9 开始这是可能的

var c ='b';

if (c is 'a' or 'b' or 'c')
  Console.WriteLine("yes");

编译为

if (c == 'a' || c == 'b' || c == 'c')
{
   Console.WriteLine("yes");
}

或者您可以获得更多创意

if (c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',')
   Console.WriteLine("yes");

粗略编译为 (according to sharp io)

if (c >= 'a')
{
   if (c <= 'z')
   {
      goto IL_0025;
   }
}
else if (c >= 'A')
{
   if (c <= 'Z')
   {
      goto IL_0025;
   }
}
else if (c == ',' || c == '.')
{
   goto IL_0025;
}
bool flag = false;
goto IL_002b;
IL_0025:
flag = true;
goto IL_002b;
IL_002b:
if (flag)
{
   Console.WriteLine("yes");
}

或者在开关中使用它

switch (c)
{
   case 'a' or 'b' or 'c':
      Console.WriteLine("yes");
   break;
}

答案 8 :(得分:1)

if(a==x?true:a==y?true:a==z?true:false)

答案 9 :(得分:1)

试试这个

var res2 = new[] { 1, 2, 3 }.Any(x => x == 2);

答案 10 :(得分:0)

例如,你的逻辑是这样的:

if(a==x || a== y|| a==z)
{
    DoSomething();
} 
else
{
   DoOtherThings();
}

将相当于:

if(a!=x&& a != y && a!= z)
{
   DoOtherThings();
}
else
{
   DoSomething();
}

干杯。