C#. Do if( a == (b or c or d)). Is it possible?

前端 未结 11 1626
无人及你
无人及你 2021-02-02 09:31

Is there another way to write something like this:

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

One way that I found is doing it like this:

         


        
相关标签:
11条回答
  • 2021-02-02 09:56

    I often use an extension method that mimics SQLs IN:

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

    That way I can do

    if(a.IsIn(b, c, d)) { ... }
    
    0 讨论(0)
  • 2021-02-02 10:04

    You have the classic switch statement :

    switch(a) {
        case x:
        case y:
        case z:
            // Do stuff
            break;
    }
    
    0 讨论(0)
  • 2021-02-02 10:04

    So, you want to replace a simple, efficent language construct that contains short-circuit optimisations into something much slower that has the potential for throwing exceptions?

    However, if the items you want to compare against are not fixed in quantity, i.e. at run time it could be t,u,v,w,x,y,z,etc..., then the Collection.Contains method is the only option, but then you'd be passing collection objects around rather than individual values and so there's little memory allocation ovrehead.

    If you've got a large number of items to compare 'a' against, but the items are not dynamic at run time then a switch statement might be a better fit.

    0 讨论(0)
  • 2021-02-02 10:05

    Fun fact, as of C#9 this is possible

    var c ='b';
    
    if (c is 'a' or 'b' or 'c')
      Console.WriteLine("yes");
    

    Which compiles to

    if (c == 'a' || c == 'b' || c == 'c')
    {
       Console.WriteLine("yes");
    }
    

    Or you can get more creative

    if (c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',')
       Console.WriteLine("yes");
    

    Which would roughly compile to (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");
    }
    

    Or use it in a switch

    switch (c)
    {
       case 'a' or 'b' or 'c':
          Console.WriteLine("yes");
       break;
    }
    
    0 讨论(0)
  • 2021-02-02 10:06

    Try this

    var res2 = new[] { 1, 2, 3 }.Any(x => x == 2);
    
    0 讨论(0)
  • 2021-02-02 10:07

    Just for fun:

    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);
        }
    }
    

    But I really think that the best way is to write the plain check

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

    As everybody will understand immediately what it does.

    0 讨论(0)
提交回复
热议问题