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:
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)) { ... }
You have the classic switch statement :
switch(a) {
case x:
case y:
case z:
// Do stuff
break;
}
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.
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;
}
Try this
var res2 = new[] { 1, 2, 3 }.Any(x => x == 2);
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.