更快的if语句:如果`variable`是“value”或“value”

你怎么能在一个论点中与多种可能性进行比较?

例:

if ((integer == 2) || (integer == 5)) if ((string == "hello") || (string == "dolly)) 

如果你能写这样的话,会节省很多代码:

 if (integer == (2 || 5)) if (string == ("hello" || "dolly")) 

首先,string比较在C中并不是那种方式,对于objective-c,我一无所知。

为了与编译时积分常量进行比较,在C语言中有switch语句:

 switch (integer) { case 2: ; case 5: ; /* do stuff here */ } 

其实,你可以检查NSSet是否包含一些对象。 这不会与int,因为它不是一个对象,但将与NSString的工作。

我相信可以这样写:

 if ( [[NSSet setWithObjects:@"hello", @"dolly", nil] containsObject:string] ) 

所以,如果你想比较整数,你应该用NSNumber包装它们。

如果不比较几十个对象,这将不会节省很多代码,但是这看起来和你想得到的非常相似:)

更新:

或者另一种方式(与John Calsbeek的答案非常相似,但适用于多个参数):

 @implementation NSObject (IsEqualMultiple) - (BOOL)isEqualToOneOfObjects:(id)firstObject, ... { id eachObject; va_list argumentList; if (firstObject) { if ( [self isEqual:firstObject] ) return YES; va_start(argumentList, firstObject); while (eachObject = va_arg(argumentList, id)) if ( [self isEqual:eachObject] ) return YES; va_end(argumentList); } return NO; } @end 

用法:

 if ( [string isEqualToOneOfObjects:@"hello", @"dolly", @"this", @"is", @"Louis", nil] ) 

如果你想用对象types(比如说NSString来做到这一点,并且你对类别感到满意,你可以添加一个类别方法:

 @implementation NSObject (IsEqualMultiple) - (BOOL)isEqualTo:(id)obj1 or:(id)obj2 { return [self isEqual:obj1] || [self isEqual:obj2]; } @end 

那么你可以像这样使用它:

 if ([string isEqualTo:@"hello" or:@"dolly"]) 

这不是语言的一部分。 如果你真的想要避免input,你可以创build一个函数来完成这个function,如下所示:

 int intIsIn (int needle, int *haystack, size_t sz); : if (intIsIn (integer, {2,5}, 2)) ... 

(和其他数据types相似)。 我质疑这种方法的有用性,但是因为(1)对于较长的列表来说,只是less打字; 和(2)你可能最终在“每日跆拳道” 🙂

我的意见是只是吸了起来,这不是那么多的打字。

创build一个可变参数函数或一个接收比较string数组的函数 。

如果您的整数非零且小到足以容纳unsigned charwchar_t ,那么执行此操作的便捷方法如下所示:

 if (strchr("\2\5", integer)) ... 

要么:

 if (wcschr(L"\2\5", integer)) ... 

请记住这些是八进制值,而不是十进制。 如果您愿意,可以使用hex( \x )。

对于string,使其高效的方法是使用正则expression式,或者编写自己的DFA来接受要testing的string集。

首先,你应该记住,好的编译器应该优化多重比较,如果它能够得出关于它们的结论,例如,如果通过文字集来比较值。 所以不需要像x == 1 ||那样对expression式进行优化 x == 3 || 手动x == 7。

在C中,可以在0..31范围内使用整数(或者你可以用long来代替long)

 if(((1UL<<val1)|(1UL<<val2)|(1UL<<val3)) & (1UL<<x)) ... 

这创build了具有与值对应的位的数字应当评估为真。 如果您需要与小整数的variables列表进行比较,则很方便。

您也可以使用sorting的数组值和c标准函数bsearch():

 int valuelist[] = { /* note it sorted */ 2, 5, 17, 33, 99, 103, 808 } int valuelist_length = sizeof(valuelist)/sizeof(int); /* this works only for statically allocated non-external arrays, */ /* you may need another method of evaluating number of items */ int compar_int(const void *a, const void *b) { return ((const int *)b < (const int *)a) - ((const int *)a < (const int *)b); } ... if(bsearch(&x, valuelist, sizeof(int), valuelist_length, compar_int)) { /* bsearch returns pointer to found value or NULL if it is not found */ /* so it will be evaluated as true if value exists in array */ } 

但是,只有当你有很多数字比较时,这才是有效的。