字符串相等中奇怪的Lambda行为

时间:2018-03-01 09:20:44

标签: c# .net lambda

我有一个字符串数组obj[] values,但尝试使用相等似乎与我的预期不同,有人可以澄清这个吗?

值的内容是[“train”,“train”];

var first = values.First();

values.Skip(1).All(v => Equals(v, first))
false
values.Skip(1).All(v => v.Equals(first))
true

Equals(values[0], values[1])
true
Equals(values[1], values[0])
true

values.Skip(1).All(v => Equals(v, first) == true)
false
values.Skip(1).Any(v => Equals(v, first) == false)
true

任何线索,为什么它返回false?

Edit1:我写了一个单元测试并且它通过了,我正在检查字符串是否有不同的文化,如@Michael Randall建议

Equals implementation on MSDN

2 个答案:

答案 0 :(得分:1)

您的问题必须是您的输入

注意 :您应该考虑进行正确的字符串比较。 Best Practices for Using Strings in .NET

但是,正如您可以通过适当的输入看到的,您的代码实际上可以正常工作

var first = "train";
var values = new object[]{"train", "train"};
Console.WriteLine(values.Skip(1).All(v => Equals(v, first)));
Console.WriteLine(values.Skip(1).All(v => v.Equals(first)));
Console.WriteLine(Equals(values[0], values[1]));
Console.WriteLine(Equals(values[1], values[0]));
Console.WriteLine(values.Skip(1).All(v => Equals(v, first) == true));
Console.WriteLine(values.Skip(1).Any(v => Equals(v, first) == false));

<强>输出

True
True
True
True
True
False

You can test it here

答案 1 :(得分:0)

@TheGeneral答案通常是正确答案,但在我的情况下重新启动机器会删除此问题。我的猜测是调试器有错误。