如何结合|| 运营商在条件声明中

KMC*_*KMC 77 .net c#

代替

if (foo == "1" || foo == "5" || foo == "9" ... ) 
Run Code Online (Sandbox Code Playgroud)

我喜欢将它们组合成以下(不起作用):

if (foo == ("1" || "5" || "9" ... ))
Run Code Online (Sandbox Code Playgroud)

那可能吗?

Tre*_*ley 169

不幸的是,最好的办法是创建一个扩展方法

public static bool IsOneOf<T>(this T value, params T[] options)
{
    return options.Contains(value);
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

if (foo.IsOneOf("1", "5", "9"))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

它是通用的,可以用于任何类型(int,string等).

  • 这是所有答案中最干净,最可重复使用的. (6认同)
  • 如果我当天有更多的选票,我会给你一个+1朋友.好,聪明的解决方案. (5认同)

Zbi*_*iew 37

你不能这样做.相反,你可以这样做:

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 有些人(不是我!)可能认为它是基本的或者可以由Google或网站上的其他地方回答的内容.或者有人可能只是个混蛋.或两者.我给了你一个upvote来解除伤害.拿那个,匿名的混蛋! (5认同)
  • 我不确定,但看起来除了@Gray之外,有人经常投票给所有人. (4认同)
  • 不是我,我不明白为什么我的问题被投票两次.. (2认同)

Mik*_*oud 25

一种可能的选择是:

switch (foo)
{
    case "1":
    case "5":
    case "9":
        // your code here

        break;
}
Run Code Online (Sandbox Code Playgroud)

另一种可能的选择是:

var vals = new string[] { "1", "5", "9" };
if (vals.Contains(foo))
{
    // your code here
}
Run Code Online (Sandbox Code Playgroud)


jse*_*ano 23

如果所有选项都只是一个字符,您可以这样做:

if ("159".IndexOf(foo) != -1)
{
  //do something
}
Run Code Online (Sandbox Code Playgroud)

  • 可读性...... (13认同)
  • @ user902383是的,我知道,这就是为什么我写的:**如果所有选项都只是我答案的一个字符** (4认同)

Gra*_*ray 18

这是另一种选择:

bool x = new[] { "1", "5", "9" }.Any(a => a == "5"); //x == true
bool y = new[] { "1", "5", "9" }.Any(a => a == "8"); //y == false
Run Code Online (Sandbox Code Playgroud)

.Contains(foo)在这种情况下最好使用,因为lambda的灵活性在这里被浪费了.如果有一个复杂的表达需要完成,Any会更有用.


Ica*_*rus 13

你可以这样做,如果这是你可以接受的:

if ( (new string[] {"1","9","5","6" }).Contains(foo))
{

}
Run Code Online (Sandbox Code Playgroud)

  • @SamuelEdwinWard - 是的,每次执行代码块时,它都会分配并填充一个新数组.如果允许值列表在编译时定义并且在应用程序的生命周期内基本上是"静态",则可以将其定义为const或static字段,如果频繁调用该方法,则会减少方法的GC开销. (2认同)

joe*_*joe 9

您可以使用以下switch声明:

switch (foo) {
    case "1":
    case "5":
    case "9":
        // ...
        break;
    case "2":
    case "4":
        // ...
        break;
}
Run Code Online (Sandbox Code Playgroud)

如果foo是字符串,请注意区分大小写.


Ehs*_*san 9

如果你有多个if条件,你应该总是考虑使用switch语句,因为编译器会尽可能地创建Jumptables以提高速度.你应该看一下速度测试.这里要注意的是,如果条件的数量足以覆盖开销,C#编译器也将创建一个HashTable对象.

所以这是一个更好的方法,

switch (foo) {
case "1":
case "5":
case "9":
    // ...
    break;
case "2":
case "4":
    // ...
    break;
}
Run Code Online (Sandbox Code Playgroud)