C# 哪一个更好?为什么将多个值与数组中的If或Contains进行比较

C# 哪一个更好?为什么将多个值与数组中的If或Contains进行比较,c#,performance,C#,Performance,我需要有人支持/反对这两种方法,哪一种更好,为什么 if ((new String[] { "test1", "test2", "test3", "test4"}).Contains(MySelecredFooValue)) { } 或 我需要比较到方法我的问题不集中在枚举比较上,所以我编辑了这个问题以获得更好的答案第一种方法的积极方面是代码更简洁,更容易从Foo值列表中添加或删除值 第一种方法的负面影响是,它创建了一个新的数组对象,需要更多的处理和内存开销。如果您只是比较这两个选项,那

我需要有人支持/反对这两种方法,哪一种更好,为什么

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


我需要比较到方法我的问题不集中在枚举比较上,所以我编辑了这个问题以获得更好的答案

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


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

如果您只是比较这两个选项,那么第二个选项(单个“IF”中的多个比较)会更加冗长,并且最终会更加难以理解。O值为bon O(n),因此循环性能将相当

而第一个选项将被编译成一个迭代过程

foreach(value in array)
  if (value == finalvalue) 
    return true;
因为您没有看到这个代码隐藏,所以它更干净,但是,您确实创建了一个新的数组,所以使用了内存

如果您重视性能,请使用选项2;如果您重视可读性,请使用选项1。请注意,除非在不处理阵列的情况下多次重复此过程(不太可能),否则性能影响可以忽略不计

但是,如果您不依赖于这两种实现中的任何一种,那么看起来您的最佳选择(假设实际应用程序与示例类似)是:

if(MySelectedFooValue != Foo.foo5)
{
}

或甚至考虑枚举的整数表示:

if((int)MySelectedFooValue < 4)
{
}
if((int)MySelectedFooValue<4)
{
}
一般来说,在考虑
不同的比较,我首先看O()值,然后如果反向比较更简单,那么看可读性。

您的第一个代码示例将更慢,并分配更多内存,因为:

new String[] { "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
}
//在函数外部声明此项
私有静态HashSet ValidValues=newhashset(){“test1”、“test2”、“test3”、“test4”};
//函数内部的代码
if(ValidValues.Contains(MySelecredFooValue))
{
//你的逻辑在这里
}

对于少量的条目(如3或4),一个
哈希集的性能通常不比一个数组好-但是如果有更多的条目(例如20个),那么通常一个
哈希集将成为一个
数组,用于
包含
调用。

@mjwills是的,tnx是的
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
}