[英]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.