这是更好的,为什么比较多个值与数组中的If或Contains

时间:2017-12-23 06:09:54

标签: c# performance

我需要有人赞成这两种方法更好,为什么。

 if ((new String[] { "test1", "test2", "test3", "test4"}).Contains(MySelecredFooValue))
 {
 }

 if (MySelecredFooValue == "test1" ||
     MySelecredFooValue == "test2" ||
     MySelecredFooValue == "test3" ||
     MySelecredFooValue == "test4")
 {
 }

我不得不比较我的问题而不是专注于Enums比较所以我编辑了问题以获得更好的答案

3 个答案:

答案 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),则通常 HashSetsubstantially outperform一个Contains次来电的数组。