如何让你的头发更短

本文关键字:头发 | 更新日期: 2023-09-27 18:07:13

我明白,当使用Regex时,我可以输入值|来搜索许多值。例如:

Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina");

我有一个字符串,我想与其他值进行比较,所以我使用if这样:

if (rihanna == "Rihanna" || rihanna == "sabrina")

我的问题是,如果有可能使if短?我知道这段代码不工作,但我正在寻找这样的东西:

if (rihanna == "Rihanna|sabrina")

如何让你的头发更短

单行解:

if("Rihanna|rihanna|Sabrina|sabrina".Split(new[] {'|'}).Contains(rihanna))

或不含String.Split方法用法:

if ((new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }).Contains(rihanna))

如果这种检查执行了不止一次,您应该将string[]可能的值数组保存到一个变量中:

var names = new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" };
if(names.Contains(rihanna))

您可以使用List<string>Enumerable.Contains方法。

的例子:

var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" };
if (values.Contains(rihanna)) 
{
    // etc.
}

if语句现在更加简洁,您可以快速轻松地向列表添加更多项目。如果您经常执行此操作,则应该将列表的声明移到包含类中的成员变量中,这样就不会在每次调用此方法时产生列表初始化的开销。

一个更好的解决方案是使用Enumerable.AnyString.Equals执行不区分大小写的比较:

if (values.Any(x => String.Equals(rihanna, x, StringComparison.OrdinalIgnoreCase))
{
   // your code here
}

虽然if语句现在更长了,但解决方案更加健壮。

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

作为上述答案的替代方案,也许您可以考虑使用扩展方法:

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比较,特别是与这里的一些其他替代方案相比。

调整EqualsAny检查,如果你想有OrdinalIgnoreCase或不,或随意添加任何你想要的过载。甚至可以在"Rihanna|Sabrina"中实现整个管道/分裂。

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

您可以使用自己的Regex,并将其作为单行使用。

if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success)

或者像这样不区分大小写…

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

忽略大小写,它看起来像是您要使用的,并使用String.Compare:

if(String.Compare(rihanna, "sabrina", StringComparison.OrdinalIgnoreCase) == 0 ||
   String.Compare(rihanna, "rihana", StringComparison.OrdinalIgnoreCase) == 0 ) {
    // do stuff
}

Dictionary或HashSet(可能对名称进行不区分大小写的检查)是另一种方法,如果您有多个项目并经常重复检查,则可以提供更好的性能。

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