C# 优化的C“tsql的等价物”;在(价值1,价值2)中“是否存在;?

C# 优化的C“tsql的等价物”;在(价值1,价值2)中“是否存在;?,c#,c#-4.0,C#,C# 4.0,在SQL中,您可以编写如下内容 如果值为(值1,值2),则。。。否则 在C#中,最好是编写 A) if( value == (value1 or value2) ) { ... } 或 当然你已经可以写了: C) if( new[]{value1, value2}.Contains(value) ) 但这段代码在构建新数组时速度很慢 你最喜欢哪一个?如果只有两个或三个值,我会使用如果(value==value1 | | value==value2)否则你可以使用第三种方法,但如果数组不改

在SQL中,您可以编写如下内容 如果值为(值1,值2),则。。。否则

在C#中,最好是编写

 A) if( value == (value1 or value2) ) { ... }

当然你已经可以写了:

 C) if( new[]{value1, value2}.Contains(value) )
但这段代码在构建新数组时速度很慢


你最喜欢哪一个?

如果只有两个或三个值,我会使用
如果(value==value1 | | value==value2)
否则你可以使用第三种方法,但如果数组不改变,就让数组保持静态。

如果只有两个或三个值,我会使用
如果(value==value1 | value==value2)
否则您可以使用第三种方法,但如果数组不变,则将其设置为静态。

如果
value1
value2
始终相同,我将构建一次集合(无论是集合、数组、列表还是其他),并将它们存储在静态变量中

否则,我可能会写:

if (value == value1 || value == value2)
如果我有几个值,那么为了可读性,我会创建集合-但是只有两个值我可能不会麻烦-上面的比数组创建表单IMO更可读

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

换言之:

  • 简单性优先(将两个值与
    =
    |
    进行比较就可以了)
  • 再次简化(在真正提高简化性时创建一个集合)
  • 只有在经过测试并发现它在这段代码中很重要时,才会显示性能
  • 尽可能将简单性和性能结合在一起(在合理的情况下使用单个“常量”集合)

如果
value1
value2
始终相同,我会构建一次集合(无论是集合、数组、列表还是其他),并将它们存储在静态变量中

否则,我可能会写:

if (value == value1 || value == value2)
如果我有几个值,那么为了可读性,我会创建集合-但是只有两个值我可能不会麻烦-上面的比数组创建表单IMO更可读

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

换言之:

  • 简单性优先(将两个值与
    =
    |
    进行比较就可以了)
  • 再次简化(在真正提高简化性时创建一个集合)
  • 只有在经过测试并发现它在这段代码中很重要时,才会显示性能
  • 尽可能将简单性和性能结合在一起(在合理的情况下使用单个“常量”集合)

取决于您想要实现的性能平衡和数据集的大小

如果你能负担得起一个相对昂贵的结构并且查找在性能方面绝对是关键的并且与结构相比,查找频繁发生,并且项的数量足以证明这一切,那么构建一个新的
哈希集
,然后使用HashSet.Contains


另一方面,如果您只有很少的项,那么拥有
If(value==value1 | | value==value2/*等…*/)大概就足够了。只是要小心将您的值从最可能匹配到最不可能匹配进行“排序”。例如,如果
value2
的匹配频率高于
value1
,则将上述“if”重写为:
if(value==value2 | | value==value1)
,以便
|
操作符可以执行短路。

取决于您想要实现的性能平衡和数据集的大小

如果你能负担得起一个相对昂贵的结构并且查找在性能方面绝对是关键的并且与结构相比,查找频繁发生,并且项的数量足以证明这一切,那么构建一个新的
哈希集
,然后使用HashSet.Contains


另一方面,如果您只有很少的项,那么拥有
If(value==value1 | | value==value2/*等…*/)大概就足够了。只是要小心将您的值从最可能匹配到最不可能匹配进行“排序”。例如,如果
value2
的匹配频率高于
value1
,则将上述“if”重写为:
if(value==value2 | | value==value1)
因此
|
运算符可以执行其短路。

这里的想法是,当您只有很少的非常量项时,使用一个比一系列IF更易于读取的结构。 我将建议C#团队在C#next中添加一个类似的构造:

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


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

这里的想法是,在只有少量非常量项的情况下,使用一个比一系列if更易于阅读的结构。 我将建议C#团队在C#next中添加一个类似的构造:

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


它应该扩展到一个临时集合并使用Contains,或者如果所有值都是常量,则使用const集合。

如果您想要有一个通用的解决方案,您必须有一个某种类型的集合(实现枚举)才能通过,在这种情况下,您不会创建一个新的集合。如果它只是几个值,那么实际上-您不会浪费太多内存来争取更好的解决方案和代码的可读性。如果您想要一个通用的解决方案,您必须拥有某种类型的集合(实现可枚举)才能通过