2013-12-18 3 views
0

У меня возникли трудности с несколькими опциями if.if (a или b) и оператор c

Version 1 соответствует всем без рассмотрения & & .Contains ("вверх")

if ( 
    || drow["ifName"].ToString().ToLower().Contains("vlan") 
     || drow["ifName"].ToString().ToLower().Contains("st0") 
     || drow["ifName"].ToString().ToLower().Contains("ge-0") 
    && drow["ifStatus"].ToString().ToLower().Contains("up") 
) 

Version 2 ссылок ни.

if ((
     || drow["ifName"].ToString().ToLower().Contains("vlan") 
     || drow["ifName"].ToString().ToLower().Contains("st0") 
     || drow["ifName"].ToString().ToLower().Contains("ge-0") 
    ) 
    && drow["ifStatus"].ToString().ToLower().Contains("up") 

Что-то мне не хватает?

Таблица выглядит в основном, как

ifName | ifStatus 
vlan.0 | up 
st0.1 | up 
pp0.0 | up 
ge-0/0/0 | down 

EDIT:

Итак цель состоит в том, чтобы соответствовать только те строки, которые имеют ifStatus = UP, также изменил таблицу уточнить реальный пример.

+4

Невозможно воспроизвести. Версия 2 выглядит так, как будто это должно быть правильно. –

+0

Я бы начал с введения переменных, чтобы код стал легче читать ... –

+5

Вы должны извлечь локальную переменную или 2, чтобы улучшить читаемость. Обратите внимание на общий текст 'drow [" ifName "]. ToString(). ToLower()'. – ChaosPandion

ответ

5

Каков ваш намеченный анализ? логический ИЛИ (||) и логический элемент И (&&) является левоассоциативным и имеют различный оператор старшинство:

http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

логическое и связывает более плотно, чем делает логическим ИЛИ, так что, такое выражение, как

A || B || C && D 

разбирает, как если бы оно было написано

A || B || (C && D) 

Если это ваша цель, вы «Хорошо. Если нет, вам нужно будет добавить круглые скобки, необходимые для получения требуемого синтаксического анализа. Мое подозрение в том, что ваш предполагаемый анализ больше похож:

(A || B || C) && D 

Но это не так, как ваш первоначальный тест анализирует.

Как правило, если вы смешиваете AND и OR в логическом выражении, всегда используйте круглые скобки, чтобы указать ваше намерение. Недоразумение приоритета оператора в логических выражениях является основным источником ошибок.

0

Это не может решить вашу проблему, но она должна сделать его легче увидеть, что вы делаете, а также сделать список более ремонтопригодны:

var matchNames = new[] {"a", "b", "c", "vlan.10"}; 
if (drow["ifStatus"].ToString().ToLower().Contains("up") //check up first, because it's cheaper 
    && matchNames.Any(m => drow["ifName"].ToString().ToLower().Contains(m)) 
{ 
    //... 
} 
-1

в первом случае: она производит true если какое-либо из выражений (выражение ИЛИ или выражение) оценивается как true.
Примечание: это похоже на if(A || B || C || D && E)

так что если какие-либо OR Expression in (A,B,C) расценивается как true или Expression D and E вычисляет true становится true.

во втором случае: она производит true если один из OR выражений true и AND Expression drow["ifStatus"].ToString().ToLower().Contains("up") также должны быть true как вы используете скобку пару.

Примечание: это похоже на if((A || B || C || D) && (E))

так что если какой-либо один из OR Expression (A,B,C,D) должен оценить, правда, а также и выражение E должно быть верно для получения результата true.

Попробуйте:

String name=drow["ifName"].ToString().ToLower(); 
Sting status=drow["ifStatus"].ToString().ToLower(); 

if ((name.Contains("vlan.10") || name.Contains("a") || name.Contains("b") 
     || name.Contains("c")) && (status.Contains("up"))) 
+0

Это неверно: первый случай оценивает значение 'true', если' drow ["ifname"] 'содержит любой из' "vlan.10", '" a "или' "b" ', ** OR ** если 'drow [" ifname "]' содержит "c" * и * 'drow [" ifstatus "]' содержит '" вверх ". –

+0

@NicholasCarey: Извините, это была моя ошибка, отредактировал мой пост, пожалуйста, посмотрите. –

0

Вы можете использовать сделать это, для образца, добавьте это пространство имен:

using System.Linq; 

и попробовать это:

string[] items = new[] { "vlan.10", "a", "b", "c" }; 

if (drop["IfStatus"].ToString().IndexIf("up", StringComparison.OrdinalIgnoreCase) > -1 && 
    items.Any(x => drop["IfName"].ToString().IndexOf(x, StringComparison.OrdinalIgnoreCase) > -1) 
{ 
    // true...    
} 

Читайте о Turkey Test, он показывает, почему важно использовать метод IgnoreCase для com вместо этого Contains.

0

Использование регулярного выражения здесь может упростить логику.

if((Regex.IsMatch(drow["ifName"].ToString().ToLower(), "[abc]")) 
    && (Regex.IsMatch(drow["ifStatus"].ToString().ToLower(), "up"))) 
{ 
} 
Смежные вопросы