我明白使用Regex时我可以输入值|
来搜索许多值。例如:
Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina");
我有一个字符串,我想与其他值进行比较,所以我使用if
这样:
if (rihanna == "Rihanna" || rihanna == "sabrina")
我的问题是,是否可以缩短if
?我知道这段代码不起作用,但我正在寻找这样的东西:
if (rihanna == "Rihanna|sabrina")
答案 0 :(得分: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))
答案 1 :(得分:2)
您可以使用List<string>
和Enumerable.Contains
方法。
示例:
var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" };
if (values.Contains(rihanna))
{
// etc.
}
if
语句现在更加简洁,您可以快速轻松地向列表中添加更多项目。如果您经常执行此操作,则应将列表的声明移动到包含类中的成员变量,这样每次调用此方法时都不会产生列表初始化的开销。
更好的解决方案是使用Enumerable.Any
和String.Equals
执行不区分大小写的比较:
if (values.Any(x => String.Equals(rihanna, x, StringComparison.OrdinalIgnoreCase))
{
// your code here
}
尽管if
语句现在更长,但解决方案更加强大。
答案 2 :(得分:1)
如果您正在寻找更容易维护可能很长的字符串候选列表,为什么不使用switch语句?从技术上讲,它将在字符方面“更长”,但如果你不得不修改一些东西,或提供一些微妙的二次处理,它可以使事情变得更容易。
答案 3 :(得分: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”。
编辑:也许更为关键的是,它集中了你如何比较,而不是在任何地方复制代码。
答案 4 :(得分:0)
您可以使用自己的正则表达式并将其用作单行..
if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success)
或者让它像这样不区分大小..
if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){
答案 5 :(得分:0)
忽略外壳,看起来像你想要的东西,然后使用String.Compare
:
if(String.Compare(rihanna, "sabrina", StringComparison.OrdinalIgnoreCase) == 0 ||
String.Compare(rihanna, "rihana", StringComparison.OrdinalIgnoreCase) == 0 ) {
// do stuff
}
答案 6 :(得分:0)
Dictionary或HashSet(可能会对名称进行不区分大小写的检查)是另一种方法,如果您有多个项目并经常重复检查,它会为您提供更好的性能。
var listToCheck = new Dictionary<string, string>(
StringComparer.CurrentCultureIgnoreCase) { { "rihanna", null}};
if (listToCheck.ContainsKey("Rihanna")) ....