取代
if (foo == "1" || foo == "5" || foo == "9" ... )
我喜欢将它们组合在一起,类似于以下方式(但不起作用):
if (foo == ("1" || "5" || "9" ... ))
那有可能吗?
很遗憾,你最好的选择是创建一个扩展方法。
public static bool IsOneOf<T>(this T value, params T[] options)
{
return options.Contains(value);
}
你可以这样使用它:
if (foo.IsOneOf("1", "5", "9"))
{
...
}
通用类型可以用于任何类型(int、string等)。
params T[]
数组始终是 O(N)
,因此它不一定会从短路中受益。 - Lie Ryan你不能用这种方式做。相反,你可以这样做:
string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
// do something
}
有一个可能的选择:
switch (foo)
{
case "1":
case "5":
case "9":
// your code here
break;
}
另一个可能的选择是这个:
var vals = new string[] { "1", "5", "9" };
if (vals.Contains(foo))
{
// your code here
}
if ("159".IndexOf(foo) != -1)
{
//do something
}
这里还有另一个选择:
bool x = new[] { "1", "5", "9" }.Any(a => a == "5"); //x == true
bool y = new[] { "1", "5", "9" }.Any(a => a == "8"); //y == false
在这种情况下最好使用 .Contains(foo)
,因为 lambda 的灵活性在这里浪费了。如果有需要执行的复杂表达式,则 Any 将更加有用。
.Contains(val)
而不是.Any(x => x == val)
。 - fjdumont.Contains
会执行二分查找... 而 .Any
仍然需要 O(n) 的时间进行查找。 - Gray如果这对你可行,你可以这样做:
if ( (new string[] {"1","9","5","6" }).Contains(foo))
{
}
string
,编译器会根据指定的数组值自动推断出来。 - Sandor Drieënhuizenswitch
语句:switch (foo) {
case "1":
case "5":
case "9":
// ...
break;
case "2":
case "4":
// ...
break;
}
foo
是一个字符串,请注意大小写敏感性。switch (foo) {
case "1":
case "5":
case "9":
// ...
break;
case "2":
case "4":
// ...
break;
}
if (foo == any(1, 5, 9))
),而 Perl 5 代码也可以使用 CPAN 模块 http://search.cpan.org/perldoc?Quantum%3A%3ASuperpositions 或 http://search.cpan.org/perldoc?Perl6%3A%3AJunction 来使用它们。这些 any() 和 all() 函数被称为“junctions”,我很喜欢这个想法 :) - Sundar Rfoo in ("1", "5", "9")
这种语法,我认为这样更加清晰明了。如果 C# 有一种简洁的数组字面量语法,那么类似的语法可能是["1", "5", "9"].index(foo) != -1
。 - tobyodaviesif (int.Parse(foo) % 4 == 1)
将作为一个好的简单一行代码解决问题。在这种情况下假设foo
总是可以解析为单个数字的整数。由于不知道您的预期用例,因此无法确定是否符合您的需求。 - Darrel Hoffmanif(foo=~/^(1|5|9)$/)
即可。 - Narylset()
通常比始终为1的dict()
更好。 - Lie Ryan