linq任何不相等的运算符(!=)

时间:2016-09-22 07:29:25

标签: c# .net linq list

我无法理解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

5 个答案:

答案 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”。