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

问题描述 投票:-2回答:3

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

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

要么

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

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

c# performance
3个回答
1
投票

如果您只是比较这两个选项,那么第二个选项(单个“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()值,然后如果反比较更简单,那么看一下可读性。


1
投票

执行第一种方法的积极方面是代码更加精简,更容易添加或删除Foo值列表中的值。

执行第一种方法的消极方面是它创建了一个新的数组对象,需要更多的处理和内存开销。


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调用的数组。

© www.soinside.com 2019 - 2024. All rights reserved.