优化的C#相当于tsql“in(value1,value2)”?

时间:2011-09-23 12:47:11

标签: c# c#-4.0

在SQL中,您可以编写类似的内容      if(value1,value2)中的值然后是...... else ...

在C#中编写

会很不错
 A) if( value == (value1 or value2) ) { ... }

或者

 B) if( value in (value1, value2) ) { ... }

当然你已经可以写了:

 C) if( new[]{value1, value2}.Contains(value) )

但是这段代码构建一个新数组时速度很慢。

你最喜欢哪一个?

4 个答案:

答案 0 :(得分:2)

如果value1value2始终相同,我会构建一个集合(无论是集合,数组,列表还是其他),并将它们存储在静态变量中。< / p>

否则,我可能会写:

if (value == value1 || value == value2)

如果我有多个值,那么为了便于阅读,我创建集合 - 但只有两个值我可能不会打扰 - 上面比数组创建表单IMO更可读。

如果我已经去了收集创建表单,那么我会考虑优化回到非收集创建表单,只有当我发现它时应用程序太慢,证明它是由于创建集合。

换句话说:

  • 首先简化(将两个值与==||进行比较很好)
  • 再次简化(当真正提高简洁性时创建一个集合)
  • 仅在经过测试并发现在此段代码中非常重要时才开始执行
  • 尽可能简单和性能(使用单个“常量”集合,这是有意义的)

答案 1 :(得分:1)

如果只有两个或三个值,我会使用if (value == value1 || value == value2),否则你可以使用第三种方式,但如果数组不变,则使数组静止。

答案 2 :(得分:1)

取决于您希望实现的性能平衡和数据集的大小。

如果你能负担得起相对昂贵的构造,那么查找绝对是关键性能与构造相比,查找频繁发生< strong>和项目数量足以证明这一切,构建新的HashSet,然后使用HashSet.Contains

另一方面,如果您只有很少的项目,那么if (value == value1 || value == value2 /* Etc.. */)可能就足够了。请注意将您的值“排序”从最可能匹配到最不可能匹配。例如,如果value2往往比value1更频繁地匹配,请将上面的“if”重写为:if (value == value2 || value == value1),以便||运算符可以执行其短路。 / p>

答案 3 :(得分:0)

这里的想法是当你有很少的非常数项时,有一个比IF系列更易于阅读的结构。 我建议C#团队在C#next中添加这样的结构:

if(value in(value1,value2)){...}

应扩展为临时集合并使用Contains,如果所有值都是常量,则使用const集合。

相关问题