簡體   English   中英

在C#中優化字符串比較

[英]Optimize string comparison in C#

我在asp.net按鈕上單擊以下代碼

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

我如何優化這段代碼?

更新:道歉大家! 我並不是想將它與文字字符串ipaddr進行比較。 我的意思是將其與ipaddr1,ipaddr2持有的值進行比較,依此類推

用。。。來代替:

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

針對可讀性進行了優化(不一定是性能)。

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對性能非常重要。

我會做類似的事情:

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

編輯

更新后,我將執行以下操作:

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

為了獲得更好的性能,請考慮使用HashSet<string>而不是數組,尤其是在有效字符串列表不變的情況下。

關於什么

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>List<string> ,例如ipaddr 然后查看字符串str是否包含在內,只需執行以下操作:

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

我會做一個

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

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

更具可讀性和更高性能的將是:

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

(盡管,非常冗長...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM