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

Omu*_*Omu 27 .net c#

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

if (a == x || a == y || a == z)
Run Code Online (Sandbox Code Playgroud)

我找到的一种方法是这样做:

if( new [] {x,y,z}.Contains(a))
Run Code Online (Sandbox Code Playgroud)

还有其他好方法吗?

Dav*_*und 64

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

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

这样我就能做到

if(a.IsIn(b, c, d)) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 不应该返回一个布尔值? (4认同)
  • 使用`params`就是天才.+1! (3认同)
  • 应该注意的是,这与你的第二个例子做的完全相同,但是它把它安排在一个数组中并在视线之外进行搜索,这样你就可以进行简单易读的操作了. (2认同)
  • 你太快了!(1) (2认同)
  • @Gertjan:如果`a`为null,如果集合中的任何其他项为null,则返回*true*,如果集合中没有其他项为null,则返回*false*.应该注意你可以写`string a = null; a.IsIn("a","b")`但你*不能*写`null.IsIn("a","b")`因为在这种情况下不能推断出类型.但无论如何,写下来都是荒谬的...... (2认同)

Mon*_*ong 12

你有经典的switch语句:

switch(a) {
    case x:
    case y:
    case z:
        // Do stuff
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果x,y和z不是常数,c#会不会出现问题? (2认同)
  • @SiN:对吧?没有.交换机要求每种情况都是编译时常量 (2认同)
  • @Ray,它不是因为你可以在案例x之后放一些代码:并允许它落到案例y:.只要案件之间没有代码,就可以了. (2认同)

Pao*_*sco 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我真的认为最好的方法是写普通支票

if(a == x || a == y || a == z)
Run Code Online (Sandbox Code Playgroud)

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


Gra*_*amS 5

你重写它的解决方案

if( new [] {x,y,z}.Contains(a))
Run Code Online (Sandbox Code Playgroud)

这不是一个好举措.

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

如果你不尝试"聪明",有时候你的同事会喜欢它!


Dan*_*bić 5

考虑一种情况,其中a == x,yz是评估速度慢,功能昂贵的函数.

  • 如果if(a == x || a == y || a == z)你有短路操作员的好处||,那么yz将不会被评估.
  • 如果您的阵列new[] { x, y, z }- Ÿž将被评估每一次.

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