Оптимизировать сравнение строк в C # - PullRequest
1 голос
/ 11 марта 2011

У меня есть следующий код при нажатии кнопки asp.net

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

Как я могу оптимизировать этот кусок кода?

Обновление: Приношу извинения всем! Я не хотел сравнивать его с буквальной строкой ipaddr. Я имею в виду сравнить его со значением ipaddr1, ipaddr2 держит и так далее

Ответы [ 6 ]

4 голосов
/ 11 марта 2011

заменить на:

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

Оптимизирован для удобочитаемости не обязательно производительность.

2 голосов
/ 11 марта 2011

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.Ordinal или StringComparison.OrdinalIgnoreCase очень важны для производительности.

1 голос
/ 11 марта 2011

Как насчет

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
}
1 голос
/ 11 марта 2011

Я бы сделал что-то вроде:

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

Редактировать :

После вашего обновления я бы сделал что-то вроде:

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

Для повышения производительности рассмотрите возможность использования HashSet<string> вместо массива, особенно если список допустимых строк не изменяется.

0 голосов
/ 11 марта 2011

И более читабельным, и более производительным будет:

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

(хотя, по общему признанию, многословно ...)

0 голосов
/ 11 марта 2011

Я бы сделал

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

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