我无法理解linq任何操作员。让我们考虑以下代码片段(使用VS 2010和.Net 4.0)
List<string> sample = new List<string> { "a", "b", "c", "d" };
List<string> secondSample = new List<string> { "b", "c" };
foreach (string s in sample)
{
if(secondSample.Any(data=> data.ToString() == s))
Console.WriteLine(s);
}
运行时会产生以下输出
b
c
这是我所期待的。但是,如果我将等于运算符(==
)更改为不等于(!=
),我会得到此
a
b
c
d
不应该
a
d
如果我将if条件更改为
if(!(secondSample.Any(data=> data.ToString() == s)))
我得到了
a
d
所以我的问题是我是否以错误的方式解释了Any运算符?不应该
if(secondSample.Any(data=> data.ToString() != s))
当来自secondSample
的值不在样本中时,评估为true
答案 0 :(得分:4)
如果你想使用!=运算符,结果是a d
,那么你应该使用All
而不是Any
:
if(secondSample.All(data=> data.ToString() != s))
Console.WriteLine(s);
解释 secondSample.Any(data=> data.ToString() != s)
如果secondSample
中只有一个元素不等于给定的数据项(在sample
列表中),则为真,所以你的情况总是如此,你会看到所有元素都写在控制台中。
更好的解决方案有两个数组A和B,如果你想要那些不在B中使用LINQ的A元素你可以尝试Except
如果你正在寻找常见的元素你可以尝试Intersect
:
List<string> A = new List<string> { "a", "b", "c", "d" };
List<string> B= new List<string> { "b", "c" };
var AnotInB = A.Except(B).ToList(); //a, d
var AInB = A.Intersect(B).ToList(); //b, c
答案 1 :(得分:2)
!=在任何意味着所有不相等。
所以,如果有任何不相等的东西你就读了,那么就可以打印了。 猜猜看,你总是至少有一个不相等的东西。这就是你得到所有答案的原因。
在你的另一个陈述中你说:那个不相同的你可以打印...
是什么清楚的?答案 2 :(得分:1)
任何运算符基本上都会问'集合中是否有任何元素可以回答谓词'。在你的情况下,它是存在的,所以它是正确的输出。
答案 3 :(得分:1)
使用存在
List<string> sample = new List<string> { "a", "b", "c", "d" };
List<string> secondSample = new List<string> { "b", "c" };
foreach (string s in sample)
{
if (!secondSample.Exists(data => data.ToString() == s))
Console.WriteLine(s);
}
答案 4 :(得分:0)
当你换到!=
时,它是全部,而不是任何 if(secondSample.All(data=> (data.ToString() != s)))
当你否定一个表达内部或成为一个和:“A或B”的否定变为“不是A而不是B”。