繁体   English   中英

LINQ except() 的意外行为

[英]Unexpected behavior of LINQ Except()

我遇到了 LINQ 的奇怪行为,除了我不明白的方法。 我可以完全以不同的方式重写我的代码以使其正常工作,这不是我的问题。 我只是想了解为什么它会失败:

public void MyMethod(MyClass whatever, params object[] values){ // called with values = [ "mystr1", "mystr2", true, true ] 
  var valuesOfType = values.OfType<MyType>().ToList(); // valuesOfType is Empty List Count = 0
  values = values.Except(valuesOfType ).ToArray(); // values = [ "mystr1", "mystr2", true ] 
}

那么,通过将 except() 与空列表一起应用, values的最后一个元素就消失了吗? 这怎么可能,我在调试器中重新运行了 window 线。 它没有被分成 2 个元素。 自分配values不是问题,我用另一个变量尝试过,它仍然是trunkates。 这里发生了什么?

PS: MyType只是一个简单的类型,只有一个 get 属性。

虽然问题已经得到解答,但如果有人想亲自看看,这里有一个可复制的控制台应用程序:

namespace ConsoleApp1
{
    using System;
    using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            var para = new object[] {"str1", "str2", true, true};
            var temp = new TestClass(new Dummy1(), para);
        }

        public class TestClass
        {
            public TestClass(Dummy1 dummy1, params object[] values)
            {
                var valuesOfType = values.OfType<Dummy2>().ToList();
                values = values.Except(valuesOfType).ToArray();

                foreach (var value in values)
                {
                    Console.WriteLine(value);
                }
                
                Console.ReadKey();
            }
        }

        public class Dummy1
        {
        }

        public class Dummy2
        {
        }
    }
}

那是因为 LINQ Except产生了一个集合差异,所以重复被删除。 文档

此方法首先返回那些未出现在第二个中的元素。 它不会在第二个返回那些没有出现在第一个的元素。 仅返回唯一元素。

在您的情况下,您有两个true值,因此只返回一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM