C# 如何简化具有多个或多个案例的if条件
我在C#中有一个条件,如下所示: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
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)