如何缩短你的时间?

时间:2013-04-03 21:11:47

标签: c#

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

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

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

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

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

if (rihanna == "Rihanna|sabrina")

7 个答案:

答案 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.AnyString.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)

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

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

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