我需要有人亲/这两种方法更好,为什么。
if ((new String[] { "test1", "test2", "test3", "test4"}).Contains(MySelecredFooValue))
{
}
要么
if (MySelecredFooValue == "test1" ||
MySelecredFooValue == "test2" ||
MySelecredFooValue == "test3" ||
MySelecredFooValue == "test4")
{
}
我需要比较我的问题而不是专注于Enums比较所以我编辑了问题以获得更好的答案
如果您只是比较这两个选项,那么第二个选项(单个“if”中的多个比较)更加冗长,并且最终会使阅读更加困惑。 O值为bon O(n),因此周期性能相当。
而第一个选项将被编译成迭代过程
foreach(value in array)
if (value == finalvalue)
return true;
因为你没有看到这个代码隐藏,所以它更清晰,但是,你创建一个新的数组,所以使用内存。
如果您重视性能使用选项2,如果您重视可读性,请使用选项1.请注意,性能影响可以忽略不计,除非此过程重复多次而不处理数组(不太可能)。
但是,如果你不依赖于这些实现中的任何一个,真的看起来你最好的选择(假设真实世界的应用程序类似于示例)将是这样的:
if(MySelectedFooValue != Foo.foo5)
{
}
或者甚至考虑枚举的整数表示:
if((int)MySelectedFooValue < 4)
{
}
通常,在考虑不同的比较时,我首先看O()值,然后如果反比较更简单,那么看一下可读性。
执行第一种方法的积极方面是代码更加精简,更容易添加或删除Foo值列表中的值。
执行第一种方法的消极方面是它创建了一个新的数组对象,需要更多的处理和内存开销。
您的第一个代码示例将更慢并分配更多内存,因为:
new String[] { "test1", "test2", "test3", "test4"}
将在每次调用时创建一个新数组,并且迭代数组会产生(小)perf成本。
您可以通过将此数组存储在static field
中来抵消创建成本(即只创建一次):
private static string[] ValidValues = {"test1", "test2", "test3", "test4"};
你的第二个代码示例会更快,但也更冗长(因为重复MySelecredFooValue
)。考虑将其更改为:
switch (MySelecredFooValue)
{
case "test1":
case "test2":
case "test3":
case "test4":
//Your logic here
break;
}
如果您真的喜欢阵列方法,并希望获得更好的性能,请尝试:
// declare this outside of your function
private static HashSet<string> ValidValues = new HashSet<string>() {"test1", "test2", "test3", "test4"};
// code for inside the function
if (ValidValues.Contains(MySelecredFooValue))
{
//Your logic here
}
对于少量条目(如3或4),HashSet
的性能通常不比数组好 - 但如果有更多条目(例如20),那么通常HashSet
将substantially outperform用于Contains
调用的数组。