C# 如何缩短if?

C# 如何缩短if?,c#,C#,我知道在使用正则表达式时,我可以输入值|来搜索许多值。例如: Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina"); 我有一个字符串,我想与其他值进行比较,所以我使用如下if: if (rihanna == "Rihanna" || rihanna == "sabrina") if (rihanna == "Rihanna|sabrina") 我的问题是是否可以缩短if?我知道这段代码不起作用,但我正在寻找这样的代码: i

我知道在使用正则表达式时,我可以输入值|来搜索许多值。例如:

Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina");
我有一个字符串,我想与其他值进行比较,所以我使用如下if:

if (rihanna == "Rihanna" || rihanna == "sabrina")
if (rihanna == "Rihanna|sabrina")
我的问题是是否可以缩短if?我知道这段代码不起作用,但我正在寻找这样的代码:

if (rihanna == "Rihanna" || rihanna == "sabrina")
if (rihanna == "Rihanna|sabrina")
您可以将列表与方法一起使用

例如:

var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" };

if (values.Contains(rihanna)) 
{
    // etc.
}
虽然if语句现在更长了,但解决方案更加健壮。

您可以在使用该方法的同时使用列表

例如:

var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" };

if (values.Contains(rihanna)) 
{
    // etc.
}
虽然if语句现在更长了,但解决方案更加健壮。

单行解决方案:

if("Rihanna|rihanna|Sabrina|sabrina".Split(new[] {'|'}).Contains(rihanna))
或不带字符串。拆分方法用法:

if ((new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }).Contains(rihanna))
如果多次执行此类检查,则应将可能值的字符串[]数组保存到变量中:

var names = new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" };

if(names.Contains(rihanna))
单线解决方案:

if("Rihanna|rihanna|Sabrina|sabrina".Split(new[] {'|'}).Contains(rihanna))
或不带字符串。拆分方法用法:

if ((new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }).Contains(rihanna))
如果多次执行此类检查,则应将可能值的字符串[]数组保存到变量中:

var names = new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" };

if(names.Contains(rihanna))

如果您希望更容易地维护可能很长的候选字符串列表,为什么不使用switch语句呢?从技术上讲,它的字符长度会更长,但如果您必须修改某些内容,或者提供一些微妙的二次处理,那么这可能会使事情变得更容易。

如果您希望更容易地维护可能很长的候选字符串列表,为什么不使用switch语句呢?从技术上讲,它的字符长度会更长,但是如果你不得不修改一些东西,或者提供一些微妙的二次处理,这会使事情变得更容易。

你可以使用自己的正则表达式,并将其作为一行使用

if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success)
或者像这样让它变得毫无意义

if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){

您可以使用自己的正则表达式并将其作为单行使用

if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success)
或者像这样让它变得毫无意义

if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){

忽略套管,它看起来像你要找的东西,使用管柱。比较:


忽略套管,它看起来像你要找的东西,使用管柱。比较:


作为上述答案的一种选择,也许你可以考虑使用扩展方法:

public static bool EqualsAny(this string input, params string[] values)
{
    return values.Any(v => String.Equals(input, v, StringComparison.OrdinalIgnoreCase));
}
其用法如下:

if (rihanna.EqualsAny("Rihanna", "Sabrina"))
这将为您提供非常可读/紧凑/简短的if比较,尤其是与这里的一些其他备选方案进行比较

如果您想使用OrdinalIgnoreCase或不想使用OrdinalIgnoreCase,请调整EqualsAny检查,或者随意添加任何您想要的重载。甚至可以在Rihanna | Sabrina经过的地方实施整个管道/分割


编辑:也许更关键的是,它集中了你如何比较,而不是复制代码到处。

< P>作为上述答案的替代品,也许你可以考虑使用扩展方法:

public static bool EqualsAny(this string input, params string[] values)
{
    return values.Any(v => String.Equals(input, v, StringComparison.OrdinalIgnoreCase));
}
其用法如下:

if (rihanna.EqualsAny("Rihanna", "Sabrina"))
这将为您提供非常可读/紧凑/简短的if比较,尤其是与这里的一些其他备选方案进行比较

如果您想使用OrdinalIgnoreCase或不想使用OrdinalIgnoreCase,请调整EqualsAny检查,或者随意添加任何您想要的重载。甚至可以在Rihanna | Sabrina经过的地方实施整个管道/分割

编辑:也许更重要的是,它集中了比较的方式,而不是到处重复代码。

或者可能使用不区分大小写的名称检查是另一种方法,如果您有多个项目并且经常重复检查,它将为您提供更好的性能

 var listToCheck = new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase) { { "rihanna", null}};

 if (listToCheck.ContainsKey("Rihanna")) ....
或者,如果您有多个项目并且经常重复检查,那么另一种方法可能是使用不区分大小写的名称检查,这将为您提供更好的性能

 var listToCheck = new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase) { { "rihanna", null}};

 if (listToCheck.ContainsKey("Rihanna")) ....

我已经编辑了你的标题。请看,如果共识是否定的,他们就不应该这样做。为什么短一点在这里很重要?Regex sabrina=我就知道!正则表达式是女性!这一定是为什么这么多人不理解它们。我编辑了你的标题。请看,如果共识是否定的,他们就不应该这样做。为什么短一点在这里很重要?Regex sabrina=我就知道!正则表达式是女性!这就是为什么这么多人不理解他们的原因。最后,他必须创建一个列表,这样它才能真正被理解longer@caerolus-代码可能更长,但if将更短。问题已得到回答,但我不认为以牺牲其他地方更多代码为代价来缩短代码有什么好处。“你为什么要缩短它?”史蒂文马西亚诺这是一个很好的问题。我的代码的第二个版本更长,但处理的情况更多,这不是双关语——比一段更短、不太有用的代码要好得多。@Donut我在看到您的编辑之前发表了评论。我喜欢你的第二个解决方案——非常好。最后,他必须创建一个列表,这样它才能真正实现longer@caerolus-代码可能更长,但if将更短。问题已得到回答,但我不认为以牺牲其他地方更多代码为代价来缩短代码有什么好处。“你为什么要缩短它?”史蒂文马西亚诺这是一个很好的问题。我的代码的第二个版本更长,但处理更多的情况,而不是pun int
结束-比一段较短、不太有用的代码要好得多。@Donut我在看到您的编辑之前发表了评论。我喜欢你的第二个解决方案——非常好。我认为从长远来看,最后一个方案似乎是最好的选择。易于维护如果需要更多的选项,您甚至可以将现有的集合传入,如果您正在寻找一些额外的动态处理。我认为从长远来看,最后一个选项看起来是最好的选择。易于维护如果需要更多选项,您甚至可以在寻找其他动态处理时传入现有集合。若要仅忽略第一个字母的大小写,还可以使用[Rr]ihanna|[Ss]abrina若要仅忽略第一个字母的大小写,还可以使用[Rr]ihanna|[Ss]abrina