Comparing Multiple Values

downs default_357-line at yahoo.de
Tue Mar 11 05:39:55 PDT 2008


Bill Baxter wrote:
> okibi wrote:
>> I've looked all over the site but can't seem to find if D supports any
>> kind of like IN statement for comparisons. For example, I can do the
>> following in SQL:
>>
>> select *
>> from table
>> where value in (1,2,3)
>>
>> And it will compare it to 1, 2, and 3. Is this possible to do within
>> D's if statement? I hate to go about it as such:
>>
>> if (value == 1 || value == 2 || value == 3)
>>     dosomething();
>>
>> Just seems like this could be written better. Can anyone give me any
>> pointers?
> 
> I can point you to a bunch of discussions where certain people argued
> tooth and nail that  "if(value in [1,2,3])" should mean
> "if(value==0||value==1||value==2)", leading basically to a stalemate.
> So, no.  Nothing like that is in the language.
> 
> But you can write a little "contains" function that will do the trick.
> 
> Or ask Downs how to make "if(x /In/ [1,2,3])" work.
> 
> --bb

There's a better way actually.

import std.stdio;

// bottom-inclusive, top-exclusive, like slices.
struct _Range(T) {
  T from, to;
  bool opIn_r(U)(U u) {
    return u < to && u !< from;
  }
}

struct Range {
  static _Range!(T) opSlice(T, U)(T from, U to) {
    return _Range!(T)(from, to);
  }
}

void main() {
  writefln(3 in Range[2..4], " -- ", 4 in Range[2..4]);
}

Have funs!

 --downs


More information about the Digitalmars-d-learn mailing list