Enumerable.SequenceEqual和 EqualityComparer

发布于 2024-11-02 11:33:32 字数 1078 浏览 1 评论 0原文

来自 MSDN

的 SequenceEqual(IEnumerable, IEnumerable) 方法 枚举两个源序列 并行并比较相应的 使用默认相等的元素 TSource 的比较器,默认。这 默认相等比较器,Default,是 用于比较类型的值 实施 IEqualityComparer 通用 界面。

a) 据我理解上面的引用,它暗示 EqualityComparer.Default 用于比较实现 IEqualityComparer 的类型的元素,而实际上Default 用于返回 IEqualityComparer 的特定实现,该实现可以调用IEquatable.Equals (假设 T 可分配给 IEquatable )或者调用 Object.Equals >

b) 引用还表明 TSource 必须实现 IEqualityComparer,这是不正确的:

   static void Main(string[] args)
   {
        Test test1 = new Test();
        Test test2 = new Test();

        Test[] list1 = { test1, test2 };
        Test[] list2 = { test1, test2 };

        bool eq = list1.SequenceEqual(list2); //works
   }     

  public class Test { }

那么我是否误解了引用的意图传达还是引用完全错误?

谢谢

From MSDN

The
SequenceEqual(IEnumerable,
IEnumerable) method
enumerates the two source sequences in
parallel and compares corresponding
elements by using the default equality
comparer for TSource, Default. The
default equality comparer, Default, is
used to compare values of the types
that implement the
IEqualityComparer generic
interface.

a) As I understand the above quote, it's implying that EqualityComparer<T>.Default is used to compare elements of types that implement the IEqualityComparer<T>, when in fact Default is used to return a particular implementation of IEqualityComparer<T> that either calls IEquatable<T>.Equals (assuming T is assignable to IEquatable<T> ) or it calls Object.Equals

b) Quote also suggests that TSource must implement IEqualityComparer<T>, which isn't true:

   static void Main(string[] args)
   {
        Test test1 = new Test();
        Test test2 = new Test();

        Test[] list1 = { test1, test2 };
        Test[] list2 = { test1, test2 };

        bool eq = list1.SequenceEqual(list2); //works
   }     

  public class Test { }

So did I misinterpret what the quote is trying to convey or is the quote plain wrong?

thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

-黛色若梦 2024-11-09 11:33:32

不是 TSource 应该实现 IEqualityComparer

,而是 EqualityComparer.Default 实现 IEqualityComparer

默认的相等比较器,Default,用于比较实现 IEqualityComparer 通用接口的类型的值。

这太容易被忽视了,不值得提及。

Not TSource should implement IEqualityComparer

But EqualityComparer<T>.Default implements IEqualityComparer

The default equality comparer, Default, is used to compare values of the types that implement the IEqualityComparer generic interface.

That's too oblivious to be mentioned.

断肠人 2024-11-09 11:33:32

来自 MSDN

Default 属性检查是否
T 型实现了
System.IEquatable 接口,如果
所以,返回一个 EqualityComparer
使用该实现。
否则,它返回一个 EqualityComparer,它使用
重写 Object.Equals 和
T提供的Object.GetHashCode。

在您的示例中,它仅使用引用相等性,这是引用对象的默认相等性实现。

From MSDN:

The Default property checks whether
type T implements the
System.IEquatable interface and, if
so, returns an EqualityComparer
that uses that implementation.
Otherwise, it returns an EqualityComparer that uses the
overrides of Object.Equals and
Object.GetHashCode provided by T.

In your example case it just uses reference equality which is the default equality implementation for reference objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文