C# 字符串与一组字符串值的比较

C# 字符串与一组字符串值的比较,c#,.net,string,C#,.net,String,我有这样一个函数(foo):我需要比较输入字符串并相应地执行任务。 任务相同,但仅适用于选定的一组值。对于所有其他值,不执行任何操作 function foo(string x) { if(x == "abc") //do Task1 if(x == "efg") //do Task1 if(x == "hij") //do Task1 if(x == "lmn") //do Task1 } 除此之外,还有其他方法进行检查吗?或者如果,将或运算符放在内 首选

我有这样一个函数(foo):我需要比较输入字符串并相应地执行任务。 任务相同,但仅适用于选定的一组值。对于所有其他值,不执行任何操作

function foo(string x)

{
if(x == "abc")
    //do Task1

if(x == "efg")
    //do Task1
if(x == "hij")
    //do Task1
if(x == "lmn")
    //do Task1
}
除此之外,还有其他方法进行检查吗?或者如果,将
运算符放在

首选的方法是什么?

像这样做

function foo(string x)
{
  switch(x)
  {
      case "abc":
      case "efg":
      case "hij":
      case "lmn":
        {
          //do task 1
          break;
        }
      default:
        break;
  }
}
或者你也可以这样做

if(x == "abc"||x == "efg"||x == "hij"||x == "lmn")
   //do Task1

有很多方法可以做到这一点。一个是:

var target = new HashSet<string>{ "abc", "efg", "lmn" };
if (target.Contains(x)) {
    ...
}

这样做将确保只创建一次集合,并且不会在每次执行使用集合的方法时重新创建集合。

一种方法是创建一个可接受字符串的数组,然后查看该数组是否包含x

function foo(string x)

{


     string[] strings = new string[] {"abc", "efg", "hij", "lmn"};

     if (strings.contains(x)){
        //do task 1
     }
}

您可以使用带有默认值的switch语句来捕获任何不匹配的内容


该声明非常适合此类情况;它允许您使用最少的不必要的样板文件,将目标值很好地分开编写。在我看来,switch语句并没有多大区别。有些人偏爱
if(new[]{“abc”、“efg”、“hij”、“lmn”}.Contains(x)){Task1();}
。。。“我自己也不确定,但它能起作用。”阿那克西曼德说,“这是一个很好的例子。”。但有趣的是,
string[]
实际上并不包含方法
Contains
,因此这只适用于Linq。这不是一个问题。纯数组解决方案应该是
if(array.IndexOf(new[]{“abc”、“efg”、“hij”、“lmn”},x)!=-1{…}
,但这看起来很糟糕。您只是在寻找一些好的内嵌语法吗?如果是这样的话,你可以做一个扩展方法,给你语法,比如
If(x.Is(“abc”、“efg”、“hij”、“lmn”){}
+1我想这是
If
switch
更好的替代方法,因为
switch
你仍然在写同样数量的代码。同意,另外,根据您放入的比较条目的数量,使用列表与使用哈希集可能会更快,但是随着比较列表的增加,我认为哈希集提供了更好的性能。请看这里的帖子。我认为最好的一点是,它可以让您轻松地将
target
移动到某个类或提供程序中,并执行
if(BusinessRulesFooClass.Something(x))
。事实上,根据场景的不同,它可能一直都是这样的…@NOOB你仍然可以通过十根弦获得大约三倍的速度提升。使其为静态可确保每次代码通过该方法时不会重新创建set对象。将其设置为只读是向代码读者显示您不打算在初始化后替换集合实例的一种方式。这将在编译器中启用其他优化。@NOOB您会得到什么错误?与任何
静态
变量一样,它需要在方法之外定义,并且它的声明不能使用
var
。复制粘贴方法外部答案中的第二个代码段,它应该可以工作。我假设您已使用System.Collections.Generic
也在你的文件顶部。他想执行相同的任务而不是不同的任务(所有任务都是任务1,而不是一个任务1,另一个任务2)答案的方向正确,但是格式错误…可能误解了这个问题…以这种方式实现switch case对我来说可能是一个更好的解决方案。这会导致对所有情况进行比较操作吗?而不是执行查找第一个事件的任务。
function foo(string x)

{


     string[] strings = new string[] {"abc", "efg", "hij", "lmn"};

     if (strings.contains(x)){
        //do task 1
     }
}
function foo(string x) {

    switch(x) {

     case "abc":
      //do task 1
     break;

     case "efg":
      //do task 2
     break;

     default:
      //all other cases
     break;
    }
}