1

我知道在使用 Regex 时,我可以输入值|来搜索许多值。例如:

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

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

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

我的问题是是否可以if缩短?我知道这段代码不起作用,但我正在寻找这样的东西:

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

7 回答 7

5

单线解决方案:

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))
于 2013-04-03T21:15:48.847 回答
2

您可以将 aList<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声明现在更长了,但解决方案更加健壮。

于 2013-04-03T21:13:04.100 回答
1

如果您正在寻找更容易维护可能很长的字符串候选列表,为什么不使用 switch 语句呢?从技术上讲,它会在字符方面“更长”,但如果您必须在以后修改内容,或者提供一些微妙的二次处理,它可以让事情变得更容易。

于 2013-04-03T21:18:00.467 回答
1

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

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”的地方实现整个管道/拆分。

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

于 2013-04-03T21:25:45.890 回答
0

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

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

或者让它像这样不区分大小写..

if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){
于 2013-04-03T21:18:45.437 回答
0

忽略大小写,这看起来像是你想要的东西,并使用String.Compare

if(String.Compare(rihanna, "sabrina", StringComparison.OrdinalIgnoreCase) == 0 ||
   String.Compare(rihanna, "rihana", StringComparison.OrdinalIgnoreCase) == 0 ) {
    // do stuff
}
于 2013-04-03T21:21:10.807 回答
0

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

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

 if (listToCheck.ContainsKey("Rihanna")) ....
于 2013-04-03T21:33:01.940 回答