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 == x , y和z是评估缓慢,昂贵的函数。
- 在
if(a == x || a == y || a == z)
你有短路的好处||
-operator,因此你不会评估y和z 。 - 如果使用
new[] { x, y, z }
创建数组,则每次都会评估y和z 。
如果有一个优雅的语法来创建延迟评估的序列( 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 }
然后找出mySize
是Small
还是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(); }
干杯。