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

有没有其他方式来写这样的东西:

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

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

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

还有其他好方法吗?

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

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

这样我就能做到

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

你有经典的switch语句:

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

纯娱乐:

 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) 

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

你重写它的解决方案

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

这不是一个好的举动。

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

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

考虑一种情况,其中a == xyz是评估缓慢,昂贵的函数。

  • if(a == x || a == y || a == z)你有短路的好处|| -operator,因此你不会评估yz
  • 如果使用new[] { x, y, z }创建数组,则每次都会评估yz

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

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

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

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

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

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

然后找出mySizeSmall还是Medium

 selectedSizes = Size.Small | Size.Medium; mySize = Size.Small; if (mySize & selectedSizes) { ... } 
 if(a==x?true:a==y?true:a==z?true:false) 

试试这个

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

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

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

将相当于:

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

干杯。