Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# if(a或b)和c语句_C#_If Statement_Linq - Fatal编程技术网

C# if(a或b)和c语句

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语句时遇到困难

版本1在不考虑&&.contains(“up”)的情况下匹配所有

版本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
编辑:


因此,我们的目标是只匹配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”