Lambda表达式Any返回错误的值

时间:2013-01-04 09:26:21

标签: c# lambda any

我有这个lambda表达式:

if (!myList.Any( x => x.name == "example" && x.articleNumber == "1"))
{

}
else
{

}

myList包含类中具有以下属性的对象:articleNumber,name和quantity。

这进入了if而不是在其他地方,而是有一个名为“example”和articleNumber“1”的对象。为什么会这样?

6 个答案:

答案 0 :(得分:4)

你知道你的lamda之前的!吗?

你在if语句中提出的是

如果myList不包含名称为example且文章编号为1的任何值

我不知道这是否有帮助,但如果您提供有关您希望通过该声明完成的内容的更多信息,则可能更容易回答。

答案 1 :(得分:1)

我很确定该列表不包含您认为它的条目。在if行上设置调试标记,并在该点检查列表以查看它包含的内容。您会发现该条目不存在。请记住,字符串也区分大小写,因此如果name确实是示例,则它将不匹配。

答案 2 :(得分:1)

我能看到的唯一原因是name=="example"articleNumber=="1"没有元素。请注意,==运算符在C#中区分大小写,并且某处可能存在空格。

然后,您可以使用此overload of Equals来比较不区分大小写,并使用Trim删除空格:

if (!myList.Any( x => x.name.Trim().Equals("example", StringComparison.OrdinalIgnoreCase) 
                   && x.articleNumber == "1"))
{

}
else
{

}

您还应该考虑将articleNumber的类型更改为int,因为它是一个数字。

答案 3 :(得分:1)

您的列表可能包含一些您不期望的值。

尝试将&&替换为||,看看会得到什么:

var v = myList.Where(x => x.name == "example" || x.articleNumber == "1").ToList();

只是为了看看那里有什么

答案 4 :(得分:0)

你的逻辑没有错,但你可以尝试?

if (myList.Where( x => x.name == "example").Where(x=> x.articleNumber == "1").Count() > 0)
{

}
else
{

}

或删除Casing中的所有空格和差异

if (!myList.Any( x => x.name.Trim().ToLower() == "example" && x.articleNumber.Trim().ToLower() == "1"))
{

}
else
{

}

答案 5 :(得分:-1)

Any的定义: 确定序列的任何元素是否存在或满足条件。

因此,对于序列中的每个元素,确定谓词是否与您的表达式匹配。

myList.Any( x => x.name == "example" && x.articleNumber == "1")

如果List的任何元素的名称为“example”且articleNumber为1,则返回true。

!myList.Any( x => x.name == "example" && x.articleNumber == "1")

如果List的NO元素名称为“example”且articleNumber为1,则返回true。