C# 如何简化具有多个或多个案例的if条件

C# 如何简化具有多个或多个案例的if条件,c#,C#,我在C#中有一个条件,如下所示: if( myString.Contains("UCK") OR myString.Contains("SAN") OR myString.Contains("AVB") OR myString.Contains("AVM") OR myString.Contains("SDS") OR myString.Contains("DWW") OR myString.Contains("WQP") OR myStr

我在C#中有一个条件,如下所示:

if( myString.Contains("UCK") OR
    myString.Contains("SAN") OR
    myString.Contains("AVB") OR
    myString.Contains("AVM") OR
    myString.Contains("SDS") OR
    myString.Contains("DWW") OR
    myString.Contains("WQP") OR
    myString.Contains("LHG") OR
  )
{
 mySecondString = "CATEGORY A";
}

else if( myString.Contains("UCT") OR
    myString.Contains("SAM") OR
    myString.Contains("AHJB") OR
    myString.Contains("AVR") OR
  )
{
 mySecondString = "CATEGORY B";
}

else if( myString.Contains("UKC") OR
    myString.Contains("SHZ") OR
    myString.Contains("EEB") OR
  )
{
 mySecondString = "CATEGORY C";
}

else  mySecondString = "CATEGORY D";
我想让它更专业。你建议的最好方式是什么

谢谢

使用:

可以这样称呼:

if (myString.ContainsAny("UCK", "SAN", "AVB", "AVM", "SDS", "DWW", "WQP", "LHG"))
{
    mySecondString = "CATEGORY A";
}

else if (myString.ContainsAny("UCT", "SAM", "AHJB", "AVR"))
{
    mySecondString = "CATEGORY B";
}

else if (myString.ContainsAny("UKC", "SHZ", "EEB"))
{
    mySecondString = "CATEGORY C";
}

else
{
    mySecondString = "CATEGORY D";
}
我不是最好的正则表达式生成器:

if (Regex.IsMatch(myString, "/(LHG)|(UCK)|(SAN)|(AVB)|(AVM)|(SDS)|(DWW)|(WQP)/")) {
    mySecondString = "CATEGORY A";
} else ...

是一个测试C#

正则表达式的好地方,尽管我喜欢Anderson先生的扩展方法的解决方案,如果你只是想让它快速完成:

        if (new[] { "UCK", "SAN", "AVB", "AVM", "SDS", "DWW", "WQP", "LHG" }.Any(s => myString.Contains(s)))
        {
            mySecondString = "CATEGORY A";
        }

        else if (new[] { "UCT", "SAM", "AHJB", "AVR" }.Any(s => myString.Contains(s)))
        {
            mySecondString = "CATEGORY B";
        }

        else if (new[] { "UKC", "SHZ", "EEB" }.Any(s => myString.Contains(s)))
        {
            mySecondString = "CATEGORY C";
        }

        else
        {
            mySecondString = "CATEGORY D";
        }

在我看来,最好的方法是使用
Map
(Java)或
字典
(C#):

类MyExample{
//声明静态映射(应为私有静态最终)
私有静态字典myPreciousMap=新HashMap();
公共MyExample(){
字符串categoryA=“类别A”;
String categoryX=“CATEGORY X”//您知道,A、B、C、D等
myPreciousMap.Add(“UCK”,分类);
myPreciousMap.Add(“SAN”,分类);
myPreciousMap.Add(“X”,类别X);
}
//使用它
公共字符串getCategory(字符串myString){
//这将返回精确匹配(建议使用)
//返回myPreciousMap.GetValue(myString);
//这是在使用contains
foreach(myPreciousMap中的KeyValuePair kvp){
if(myString.contains(kvp.getKey())返回kvp.getValue();
}
返回“某种默认值”;
}
}

通过这种方式,您可以避免使用所有ifs,并且可以很容易地查看相应的值并对其进行编辑。

这是对使用扩展名的建议的补充,但无论您是否使用扩展名,都适用:

如果您有这么长的条件,则应将其隔离在其自身的函数中,例如:

string GetCategory(string input)
{
    //all of your conditions
    return mySecondString;
}
然后在用于包含此条件的方法中,只需调用函数,如

var category = GetCategory(myString);
这可以做几件事:

  • 它使调用它的方法更具可读性。从某种意义上说,调用函数就像是一个注释。他们不会拥有所有这些条件并想知道它的用途,而是会看到对
    GetCategory
    的调用,并理解您得到的是类别。同样,当他们看到
    GetCategory
    函数本身时他们将从代码所在函数的名称中了解该代码的用途
  • 它使调用函数更短。建议使用15行或更少的行。这种情况本身就是这样的大小,因此将其分开可以确保调用函数不会过长
另一个建议是使用常量,比如

const string AliensVersusBovines = "AVB";
这会阻止某人阅读以下内容:

myString.Contains("AVB")
想知道“AVB”是什么,因为它不是自解释的。如果你要在多个类中使用该字符串(这似乎是可能的),那么你可以创建一个单独的类,只包含所有这些常量。这可以防止相同的字符串文字分散在代码中,这可能会成为维护问题

public class Codes
{
    public const string AliensVersusBovines = "AVB";
}
这样你的代码就可以读取了

myString.Contains(Codes.AliensVersusBovines)

C#中没有
,您的意思是
|
?此列表可能会更改吗?如果是,我会在数据库中创建一个表,假设您的应用程序使用一个表。否则,我会创建一个
字典
,其中
是像“UCK”、“SAN”这样的字符串,等等,
Value
是每个类别。这当然更多的是一种观点而不是答案,这就是为什么它出现在评论中而不是作为权威答案发布的原因。输入字符串是什么样子的?它是以一致的形式出现的,比如逗号分隔的值列表?还是只是随机文本?你能提供一个示例吗e?还有,它区分大小写吗?(这些看起来像机场代码,所以我猜不是)如果你不想引用数据库,创建一个列表可能是最好的选择。Mh,这不是等效的。但没有否决:p只有当数组包含基于
Object.Equals()的精确值时,它才会匹配
-不同于
String.Contains()
,这就是你正确阅读问题的原因:P.编辑后的答案如何?我喜欢。我忘记在我的答案中使用
Any()
。哦,好吧;)这是不等价的
myString
可以是“xyzUCK123”,您希望它映射到“CATEGORY A”,因为它包含“UCK”。@KlitosKyriacou确实,映射不适合“contains”匹配,但稍作更改即可。这里的重点是删除这一堆丑陋而难以理解的“如果”。因此,如果您必须使用contains(很简单)在映射上运行迭代,那么就这样做吧。同样,我认为,这比使用任何其他“if”从句链要好得多,只是编辑代码以适应示例。再一次,问题是“如何简化具有多个或多个案例的if条件”事实上,通过这种更改,代码可以完成任务,并且由于它是表驱动的,所以它更通用:例如,您可以轻松地添加另一个类别。我唯一保留的意见是,您现在使用的词典只是一组成对的词典。字典在内部维护一个根本不使用的哈希表。然而,如果您想要一个成对的集合,即使不是最有效的,字典也很容易使用。
public class Codes
{
    public const string AliensVersusBovines = "AVB";
}
myString.Contains(Codes.AliensVersusBovines)