我需要有人赞成这两种方法更好,为什么。
if ((new String[] { "test1", "test2", "test3", "test4"}).Contains(MySelecredFooValue))
{
}
或
if (MySelecredFooValue == "test1" ||
MySelecredFooValue == "test2" ||
MySelecredFooValue == "test3" ||
MySelecredFooValue == "test4")
{
}
我不得不比较我的问题而不是专注于Enums比较所以我编辑了问题以获得更好的答案
答案 0 :(得分:1)
执行第一种方法的积极方面是代码更加精简,更容易添加或删除Foo值列表中的值。
执行第一种方法的消极方面是它创建了一个新的数组对象,需要更多的处理和内存开销。
答案 1 :(得分:1)
如果您只是比较这两个选项,那么第二个选项(单个&#34中的多个比较;如果")更加冗长,并且最终会使阅读更加困惑。 O值为bon O(n),因此周期性能将是等效的。
而第一个选项将被编译成迭代过程
foreach(value in array)
if (value == finalvalue)
return true;
因为你没有看到这个代码隐藏,所以它更清晰,但是你创建了一个新数组,因此使用了内存。
如果您重视性能使用选项2,如果您重视可读性,请使用选项1.请注意,性能影响可以忽略不计,除非此过程重复多次而不处理数组(不太可能)。
但是,如果你不依赖于这些实现中的任何一个,真的看起来你最好的选择(假设真实世界的应用程序与示例类似)将是这样的:
if(MySelectedFooValue != Foo.foo5)
{
}
甚至考虑枚举的整数表示:
if((int)MySelectedFooValue < 4)
{
}
一般来说,考虑时 不同的比较,我首先看O()值,然后如果反比较更简单,那么看看可读性。
答案 2 :(得分:1)
您的第一个代码示例会更慢并且分配更多内存,因为:
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
次来电的数组。