C# if(a或b)和c语句
我在使用多选项if语句时遇到困难 版本1在不考虑&&.contains(“up”)的情况下匹配所有 版本2不匹配C# if(a或b)和c语句,c#,if-statement,linq,C#,If Statement,Linq,我在使用多选项if语句时遇到困难 版本1在不考虑&&.contains(“up”)的情况下匹配所有 版本2不匹配 if ( ( || drow["ifName"].ToString().ToLower().Contains("vlan") || drow["ifName"].ToString().ToLower().Contains("st0") || drow["ifName"].ToString().ToLower().Contains("ge-0"
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
编辑:
因此,我们的目标是只匹配ifStatus=UP的行,也更改了表以澄清一个真实的示例。这可能无法解决您的问题,但它应该可以更容易地查看您正在做什么,并使列表更易于维护:
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) )
{
//...
}
这可能无法解决您的问题,但它会使您更容易了解自己在做什么,并使列表更易于维护:
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) )
{
//...
}
在第一种情况下:如果表达式(或表达式或AND表达式)中的任何一个计算结果为
true
,注:它类似于if(A | | B | | | C | | D&E) 因此,如果(A,B,C)中的任何
或表达式求值为true
或表达式D和E
求值为true
则变为true
在第二种情况下:如果或表达式中的任何一个是true
和以及表达式drow[“ifStatus”]。ToString().ToLower()。包含(“up”)
在使用括号对时也必须是true
注:它类似于if((A | | B | | | C | | D)和&(E))
因此,如果或表达式(A,B,C,D)中的任何一个都应计算为true,并且表达式E
必须为true才能生成结果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")))
在第一种情况下:如果表达式(或表达式或AND表达式)中的任何一个计算结果为true
,
注:它类似于if(A | | B | | | C | | D&E)
因此,如果(A,B,C)
中的任何或表达式求值为true
或表达式D和E
求值为true
则变为true
在第二种情况下:如果或表达式中的任何一个是true
和以及表达式drow[“ifStatus”]。ToString().ToLower()。包含(“up”)
在使用括号对时也必须是true
注:它类似于if((A | | B | | | C | | D)和&(E))
因此,如果或表达式(A,B,C,D)中的任何一个都应计算为true,并且表达式E
必须为true才能生成结果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")))
您可以使用来执行此操作,对于示例,添加以下命名空间:
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...
}
阅读,它显示了为什么使用IgnoreCase
方法来比较而不是Contains
非常重要。您可以使用它来执行此操作,对于示例,添加此命名空间:
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...
}
阅读,它显示了为什么使用IgnoreCase
方法来比较而不是Contains
在此处使用正则表达式可以简化逻辑
if((Regex.IsMatch(drow["ifName"].ToString().ToLower(), "[abc]"))
&& (Regex.IsMatch(drow["ifStatus"].ToString().ToLower(), "up")))
{
}
在这里使用正则表达式可以简化逻辑
if((Regex.IsMatch(drow["ifName"].ToString().ToLower(), "[abc]"))
&& (Regex.IsMatch(drow["ifStatus"].ToString().ToLower(), "up")))
{
}
你打算做什么?逻辑OR(|
)和逻辑and(&&
)都是左关联的,并且具有不同的运算符优先级:
逻辑AND比逻辑AND绑定得更紧密,因此,类似
A || B || C && D
就像是写的一样解析
A || B || ( C && D )
如果这是你的意图,那你就是好人。如果没有,则需要根据需要添加括号以获得所需的解析。我的怀疑是,您的预期分析更像:
(A || B || C ) && D
但这不是原始测试的解析方式
一般来说,如果在逻辑表达式中混合and和OR,总是使用括号来表示您的意图。误解逻辑表达式中的运算符优先级是错误的一个主要来源。您打算解析什么?逻辑OR(|
)和逻辑and(&&
)都是左关联的,并且具有不同的运算符优先级:
逻辑AND比逻辑AND绑定得更紧密,因此,类似
A || B || C && D
就像是写的一样解析
A || B || ( C && D )
如果这是你的意图,那你就是好人。如果没有,则需要根据需要添加括号以获得所需的解析。我的怀疑是,您的预期分析更像:
(A || B || C ) && D
但这不是原始测试的解析方式
一般来说,如果在逻辑表达式中混合and和OR,总是使用括号来表示您的意图。误解逻辑表达式中的运算符优先级是错误的主要来源。无法重现。在我看来,版本2应该是正确的。您应该提取一个局部变量或2以提高可读性。注意常见的文本drow[“ifName”].ToString().ToLower()
。问题是什么?您是在问我们如何使用括号吗?而且,fwiw,检查单个字符串的.Contains()
,似乎有问题。例如,a
match使vlan.10
match变得冗余。那么您希望得到什么结果,为什么?您试图实现的目标不清楚。无法复制。在我看来,版本2应该是正确的。您应该提取一个局部变量或2以提高可读性。注意常见的文本drow[“ifName”].ToString().ToLower()
。问题是什么?您是在问我们如何使用括号吗?并且,对于单个字符字符串,检查.Contains()
似乎有问题。例如,a
match使vlan.10
match变得冗余。那么您希望得到什么结果,为什么?您试图实现的目标不清楚。这是不正确的:如果drow[“ifname”]
包含任何“vlan.10”
,“a”
或