Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中优化字符串比较#_C#_.net_String Comparison - Fatal编程技术网

C# 在C语言中优化字符串比较#

C# 在C语言中优化字符串比较#,c#,.net,string-comparison,C#,.net,String Comparison,我在asp.net按钮上单击了以下代码 if(str == ipaddr1 || ipaddr2 || ipaddr3 || ipaddr4 || ipaddr5 || ipaddr6 || ipaddr7) // do this else //cancel click event 如何优化这段代码 更新:向所有人道歉!我无意将其与文本字符串ipaddr进行比较。我的意思是将其与ipaddr1、ipaddr2保持的值进行比较,依此类推,我将执行以下操作: str.Length == 7 &am

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

if(str == ipaddr1 || ipaddr2 || ipaddr3 || ipaddr4 || ipaddr5 || ipaddr6 || ipaddr7)
// do this
else
//cancel click event
如何优化这段代码


更新:向所有人道歉!我无意将其与文本字符串ipaddr进行比较。我的意思是将其与ipaddr1、ipaddr2保持的值进行比较,依此类推,我将执行以下操作:

str.Length == 7 && str.StartsWith("ipaddr") && str[6] > '0' && str[6] < '8'
string[] validStrings = { ipaddr1, ipaddr2, ... };
bool isStrValid = validStrings.Contains(str);

<>为了更好的性能,考虑使用<代码> HasStuts<代码>而不是数组,特别是如果有效字符串的列表没有改变。

< P>我会做一些类似的事情:

str.Length == 7 && str.StartsWith("ipaddr") && str[6] > '0' && str[6] < '8'
string[] validStrings = { ipaddr1, ipaddr2, ... };
bool isStrValid = validStrings.Contains(str);
<>为了更好的性能,考虑使用<代码> HasStuts<代码>而不是数组,特别是如果有效字符串的列表没有改变。

if(str.Substring(0,6) == "ipaddr" && str[6] >= '1' && str[6] <= '7')
需要用这个替换才能编译

if(str == "ipaddr1" || str == "ipaddr2" || str == "ipaddr3" || str == "ipaddr4" || str == "ipaddr5" || str == "ipaddr6" || str == "ipaddr7")
因此,原始代码实际上比您想象的还要乏味

更新

根据您更新的问题,最好的选择是将字符串变量放入名为
的列表中,例如
ipaddr
。然后,要查看是否包含字符串
str
,只需执行以下操作:

if( ipaddr.Contains( str ) )
{
   //contained in the list
}
那怎么办

if(str.Substring(0,6) == "ipaddr" && str[6] >= '1' && str[6] <= '7')
需要用这个替换才能编译

if(str == "ipaddr1" || str == "ipaddr2" || str == "ipaddr3" || str == "ipaddr4" || str == "ipaddr5" || str == "ipaddr6" || str == "ipaddr7")
因此,原始代码实际上比您想象的还要乏味

更新

根据您更新的问题,最好的选择是将字符串变量放入名为
的列表中,例如
ipaddr
。然后,要查看是否包含字符串
str
,只需执行以下操作:

if( ipaddr.Contains( str ) )
{
   //contained in the list
}
替换为:

Regex.IsMatch(str, "^ipaddr[1-7]$")
针对可读性进行了优化不一定是性能。

替换为:

Regex.IsMatch(str, "^ipaddr[1-7]$")
优化的可读性不一定是性能。

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

if (variables.Contains(inputstring))
  ...
List variables=新列表{“ip1”、“ip2”、“ip3”、“ip4”、“ip5”};
if(variables.Contains(inputstring))
...
我会做一个

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

if (variables.Contains(inputstring))
  ...
List variables=新列表{“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;
}

(虽然,无可否认,内容过于冗长……)

更具可读性和性能的是:

switch(str)
{
case "ipaddr1": 
case "ipaddr2":
case "ipaddr3":
case "ipaddr4":
case "ipaddr5":
case "ipaddr6":
case "ipaddr7":
    //do something
    break;
default:
    //do something else
    break;
}
(虽然,无可否认,非常冗长…)

HashSet
是检查包含以下内容的最佳容器:

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

var arr = new[] { "23.55", "xuz", "i3",  "i444", "ki5", "65fr6") };
if (arr.Any(str => input.StartsWith(str, StringComparison.Ordinal))
{
    // do stuff
}
StringComparison.Ordinal
StringComparison.OrdinalIgnoreCase
对性能非常重要。

HashSet
是检查以下内容的最佳容器:

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

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


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

优化什么?表演可读性?可维护性?请注意,您的示例仅将
str
“ipaddr1”
进行比较。这可能是个错误。如果可以将这些IPADRx放入字符串列表中,您也可以将它们放在一起,而不是保留差异值\n我已更新了我的问题。我想将str与所有这些stringsAgain的值进行比较,您只是比较
str
ipaddr1
。您必须编写
str==ipaddr1 | | str==ipaddr2 | |…
优化什么?表演可读性?可维护性?请注意,您的示例仅将
str
“ipaddr1”
进行比较。这可能是个错误。如果可以将这些IPADRx放入字符串列表中,您也可以将它们放在一起,而不是保留差异值\n我已更新了我的问题。我想将str与所有这些stringsAgain的值进行比较,您只是比较
str
ipaddr1
。你必须写
str==ipaddr1 | | str==ipaddr2 | |…
对不起。我意识到我发布了错误的字符串,把每个人都弄糊涂了。问题更新我很抱歉。我意识到我发布了错误的字符串,把每个人都弄糊涂了。问题更新好了。。这个答案可能是正确的。。。(再次?):对数组或
列表进行检查肯定很慢-O(n)在哪种情况下慢?用短字符串比较七个项目。我会检查你是否有办法做这件事。有趣的是,关于性能和.Contains(),当用于sql查询时,它仍然对2100项有限制?嗯。。这个答案可能是正确的。。。(再次?):对数组或
列表进行检查肯定很慢-O(n)在哪种情况下慢?用短字符串比较七个项目。我会检查你是否有办法做这件事。有趣。关于性能和.Contains(),当用于sql查询时,它仍然对2100项有限制?谢谢。我还有一个类似的问题。如何优化此代码?如果(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”)//执行其他操作//执行此操作this@Matt当前位置我更新了我的帖子。另外,您还可以在注释中突出显示
源代码
,谢谢,我需要更多的说明。什么是输入和str,我将如何使用它们?我想将X与一组字符串进行比较,看看X是否以这些字符串包含的值开头?也许我不能正确地表达我的问题。谢谢你的耐心。我在想我真的需要str吗。如果(qry.StartsWith(“23.55”)| | qry.StartsWith(“xuz”)| |…)@Matt:
Any()
是LINQ扩展方法,
(str=>…)
是lambda expression
input
是一个变量,要比较的字符串,你称之为
qry
,什么都可以。谢谢。我还有一个类似的问题。如何优化此代码?如果(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”)//执行其他操作//执行此操作this@Matt当前位置我更新了我的帖子。另外,您还可以在注释中突出显示
源代码
,谢谢,我需要更多的说明。什么是输入和str,我将如何使用它们?我想把X和