如何简化具有多个OR情况的if条件

时间:2016-07-12 21:59:30

标签: 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
    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";

我想让它变得更专业。你建议的最佳方式是什么?

由于

5 个答案:

答案 0 :(得分:7)

使用extension method

com.ibm.worklight.*

这样称呼:

docker pull myimage:staging
docker run myimage:staging test
docker tag myimage:staging myimage:release
docker push myimage:release

答案 1 :(得分:4)

虽然我喜欢安德森先生的扩展方法解决方案,但如果你只是想让它快速而又肮脏:

        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";
        }

答案 2 :(得分:3)

可以使用Regular Expression我不是最好的正则表达式制作者:

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

Here是测试C#正则表达式的好地方

答案 3 :(得分:1)

我认为最好的方法是在C#中使用Map(在Java中)或Dictionary

class MyExample {
    // declaring your static map (should be private static final)
    private static Dictionary<String, String> myPreciousMap = new HashMap<>();

    public MyExample() {
        String categoryA = "CATEGORY A";
        String categoryX = "CATEGORY X"; // you know, A, B, C, D etc
        myPreciousMap.Add("UCK", categoryA);
        myPreciousMap.Add("SAN", categoryA);
        myPreciousMap.Add("X", categoryX);
    }

    // using it
    public String getCategory(String myString) {
        // this returns exact match (which is recommended)
        // return myPreciousMap.GetValue(myString);

        // this is using the contains
        foreach( KeyValuePair<string, string> kvp in myPreciousMap) {
            if (myString.contains(kvp.getKey()) return kvp.getValue();
        }
        return "Some sort of Default";
    }
}

通过这种方式,您可以避免所有ifs,并且可以非常轻松地查看相应的值并对其进行编辑。

答案 4 :(得分:0)

这是使用扩展程序的建议的补充,但无论您是否这样做都适用:

如果您的病情很长,您应该将其隔离在自己的功能中,例如:

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)