优化C#中的字符串比较

时间:2011-03-11 11:34:42

标签: c# .net string-comparison

我在asp.net按钮上点击了以下代码

if(str == ipaddr1 || ipaddr2 || ipaddr3 || ipaddr4 || ipaddr5 || ipaddr6 || ipaddr7)
// do this
else
//cancel click event

如何优化这段代码?

更新:向所有人致歉!我不是故意将它与文字字符串ipaddr进行比较。我的意思是将它与ipaddr1,ipaddr2等等的值进行比较

6 个答案:

答案 0 :(得分:4)

替换为:

Regex.IsMatch(str, "^ipaddr[1-7]$")

针对可读性进行了优化,但不一定是性能。

答案 1 :(得分:2)

HashSet<T>是要检查的最佳容器:

var ips = new HashSet<string> { "ip1", "ip2", "ip3", "ip4", "ip5" };
if (ips.Contains(input))
{
    // do stuff
}

对于任何类型:

var ips = new HashSet<IPHostEntry> { ip1, ip2, ip3, ip4, ip5 };
if (ips.Contains(input))
{
    // do stuff
}

当时:

if(str = qry.StartsWith("23.55") || str = qry.StartsWith("xuz") || str = qry.StartsWith("i3") || str = qry.StartsWith("i444") || str = qry.StartsWith("ki5") || str = qry.StartsWith("65fr6")) // do this else // do this

成为:

var arr = new[] { "23.55", "xuz", "i3",  "i444", "ki5", "65fr6") };
if (arr.Any(str => input.StartsWith(str, StringComparison.Ordinal))
{
    // do stuff
}

StringComparison.OrdinalStringComparison.OrdinalIgnoreCase对性能非常重要。

答案 2 :(得分:1)

我会做类似的事情:

str.Length == 7 && str.StartsWith("ipaddr") && str[6] > '0' && str[6] < '8'

修改

更新后,我会做类似的事情:

string[] validStrings = { ipaddr1, ipaddr2, ... };
bool isStrValid = validStrings.Contains(str);

为了获得更好的性能,请考虑使用HashSet<string>而不是数组,尤其是在有效字符串列表没有更改的情况下。

答案 3 :(得分:1)

怎么样?
if(str.Substring(0,6) == "ipaddr" && str[6] >= '1' && str[6] <= '7')

为了您的信息,您的原始代码甚至无法编译。此

if(str == "ipaddr1" || "ipaddr2" || "ipaddr3" || "ipaddr4" || "ipaddr5" || "ipaddr6" || "ipaddr7")

需要用此替换才能编译

if(str == "ipaddr1" || str == "ipaddr2" || str == "ipaddr3" || str == "ipaddr4" || str == "ipaddr5" || str == "ipaddr6" || str == "ipaddr7")

所以原始代码实际上比你想象的更乏味。

<强>更新

根据您更新的问题,最好的选择是将字符串变量放入List<string>调用,例如ipaddr。然后查看是否包含字符串str,只需执行以下操作:

if( ipaddr.Contains( str ) )
{
   //contained in the list
}

答案 4 :(得分:0)

我会做一个

List<string> variables = new List<string> { "ip1","ip2","ip3","ip4","ip5" };

if (variables.Contains(inputstring))
  ...

答案 5 :(得分:0)

更具可读性和更高性能:

switch(str)
{
case "ipaddr1": 
case "ipaddr2":
case "ipaddr3":
case "ipaddr4":
case "ipaddr5":
case "ipaddr6":
case "ipaddr7":
    //do something
    break;
default:
    //do something else
    break;
}

(尽管如此,大概是冗长的......)