【问题标题】:StructuralComparisons for arrays数组的结构比较
【发布时间】:2015-11-12 18:04:59
【问题描述】:

在 F# 中:

[0] = [0] = true

一般在 C# 或 .NET BCL 中:

StructuralComparisons.Equals(new int[] { 0 }, new int[] { 0 }) == false

为什么?


后记:

我认为我有“正确”的 Equals 的原因是因为事实证明这是真的:

var a = new { X = 3, Y = new { Z = -1 } };
var b = new { X = 3, Y = new { Z = -1 } };

StructuralComparisons.Equals(a, b) == true;

【问题讨论】:

  • new int[] { 0 }.SequenceEqual(new int[] { 0 }) == true;
  • 是的,但我希望对象图之间具有一般的结构相等性——但只是数组,如此处所示。我选择数组的原因是它们不相等。
  • 这是 Don Syme 关于 F# 中的平等和比较的博文:blogs.msdn.com/b/dsyme/archive/2009/11/08/…
  • @Petr,谢谢,但我对 F# 有/没有问题 ;-) ...但我只是误读了 API。我想像 StructuralComparisons.StructuralEquals 这样的方法可以让我免于尴尬。 :-)
  • 顺便说一句,[0] 在 F# 中不是数组。

标签: c# f# base-class-library structural-equality


【解决方案1】:

那是因为您将转到 object.Equals(objA, objB),它无法处理这种比较。

改为这样做:

StructuralComparisons.StructuralEqualityComparer.Equals(..., ...)

【讨论】:

  • 别这样。他们将这些辅助方法嵌入到 object 的基础中这一事实导致大量代码中出现大量错误,它们可通过智能感知获得,但有时很难与您真正想要的那些区分开来。
  • 另外,关于为什么 0 == 0 根据 object.Equals 的评论,这在 documentation 中进行了解释,它说对于引用类型进行了引用比较,但是对于值类型,进行值比较。
  • 我理解原始类型背后的原因,但我只是对 StructuralComparisons.Equals 的反直觉感到困惑,实际上是引用相等。但我应该仔细看看。有时隐藏成员会很好。 :P
猜你喜欢
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2019-02-24
  • 2011-06-16
  • 2021-04-13
相关资源
最近更新 更多