还有另一种写这样的方式:
if (a == x || a == y || a == z)
我发现的一种方法是这样做:
if( new [] {x,y,z}.Contains(a))
还有其他好方法吗?
答案 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
}
然后找出mySize
或Small
中是否有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();
}
干杯。