views:

469

answers:

6

Hi,

I just had an idea last nigth when writing an if-expression and sometimes the expression tend to be long when you have it like this:

if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... }

x can be enums,strings,ints,chars you get the picture.

I want to know if there are an easier way of writing this. I think of sql's operator 'in' for example as a eay to shorten the expression:

if(x in (1,2,33,4,-5,61)) { ... }

I know you can't write an expression like this with 'in' because the lexer and parser of the compiler won't recognize it.

Perhaps other solutions as extension methods of different types of x is the solution? In the coming .NET 4.0 i heard something about parameterized methods, should that solve the n amount of parameters supplied to the if-expression ?

Perhaps you understand me, have you an idea of a good practice/solution to this question?

/Daniel

+12  A: 

Try the following

if ( (new []{1,2,33,4,-5,61}).Any(i => x == i) ) {
  ...
}
JaredPar
That's pretty stylish.
Programming Hero
With type inference you can even skip the `int` (I think).
Svish
@Svish, didn't realize that was possible but verified it works with 2010 Beta2. Updated answer
JaredPar
I would use `new []{1,2,33,4,-5,61}).Contains(x)`, Contains is usually used to determine if a sequence contains an element and therefore more explicit in expressing the intent, Any() is more generic even of you can make it act like contains by using a simple equality check
Pop Catalin
I think the extension method route is better design. In your solution, you are duplicating the logic of the In function every time you use it. With the extension method, the algorithm is centralised and can be changed globally if required - plus it also looks cleaner at the point of use.
Winston Smith
That's pretty ugly. The extension method approach is much clearer and easier to read.
Ash
A: 
   string[] possible = new string[3] { 1, 2, 3);

   if (possible.Contains(x)) { ...
Paddy
I think you wanted int and not string there.
JaredPar
I think the question was meant for all types.
borisCallens
Hmm.. More coffee required.
Paddy
A: 
    bool In<T>(T num, params int args)
    {
        return (new List<T>(args)).Contains(num);
    }
Boris Modylevsky
Why have a generic method, which only takes a list of ints? Consider using params T[] args instead - which you can then call .Contains on directly.
Winston Smith
+1  A: 
    public static bool In<T>(this T X, params T[] list)
    {
        foreach (var item in list)
        {
            if (X.Equals(item))
                return true;
        }
        return false;
    }
Alex Reitbort
how about `return list.Contains(x);` ?
Pop Catalin
array does not have Contains method
Alex Reitbort
Array implements `IEnumerable<T>` which has a Contains extension method in System.Linq
Lee
A: 

Given that x is an int you could write an extension method like so:

public static bool In(this int i, params int[] values){
    foreach(int v in values) {
        if (i == v) {
            return true;
        }
    }
    return false;
}
Cros
+13  A: 

I usually write an Extension Method as follows:

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

Which can be used like this:

if(x.In(1,6,9,11))
{
      // do something....
}
Winston Smith
I like this one because it is generic and uses the Contains method rather then the == operator.
borisCallens