具有否定条件的Linq查询在任何未返回预期结果

时间:2016-06-10 10:07:03

标签: c# linq

class Program
    {
        static void Main(string[] args)
        {
            List<string> lista = new List<string>()
            {
            "a",
            "b",
            "c",
            "d",
            "e",
            "f"
            };

            lista.Where(l1 => Enum.GetNames(typeof(prova)).Any(l2 => l2.Equals(l1))).ToList().ForEach(l => Console.WriteLine(l));
            Console.ReadLine();

        }
    }

    public enum prova
    {
        a,
        b,
        c
    }

我正在使用C#和EF

Any(l2 => l2.Equals(l1))

我在输出中得到a,b,c

使用

Any(l2 => !l2.Equals(l1))

我在输出中得到a,b,c,d,e,f

我期待着d,e,f

发生了什么事?

3 个答案:

答案 0 :(得分:0)

你几乎拥有它,只是否定你的条件。试试这个。

 lista.Where(l1 => !Enum.GetNames(typeof(prova)).Any(l2 =>l2.Equals(l1)));

答案 1 :(得分:0)

它完成了你所说的:对于列表中的每个元素,至少有一个与该元素不相等的枚举值。

您可能想要做的事情(选择不在枚举中的那些)是:

var result = lista.Where(l1 => Enum.GetNames(typeof(prova)).All(l2 => !l2.Equals(l1))).ToList()

找到所有枚举值不相等的元素

答案 2 :(得分:0)

发生了什么
Any(l2 => !l2.Equals(l1))

就是这样,你总是得到true。因为lista中的当前元素始终不等于枚举prova中的某个元素。在!l2.Equals(l1)上添加一个断点,您就会知道更多!

如果您打算从lista获取除枚举provea以外的所有元素,您应该尝试

var enumNames = Enum.GetNames(typeof(prova));
lista.Where(l1 => !enumNames.Contains(l1)).ToList().ForEach(l => Console.WriteLine(l));