C# 为什么查找<;TKey,TValue>;。分组类不提供相等覆盖?
我有一个场景,当我不希望扩展方法返回false时,扩展方法返回false——确切地说,当使用它来比较两组(已知相同的)数据时。通过调试器,我发现我的两个集合中的实际元素都是该类的实例,因此我深入到引用源中 简而言之,C# 为什么查找<;TKey,TValue>;。分组类不提供相等覆盖?,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个场景,当我不希望扩展方法返回false时,扩展方法返回false——确切地说,当使用它来比较两组(已知相同的)数据时。通过调试器,我发现我的两个集合中的实际元素都是该类的实例,因此我深入到引用源中 简而言之,SequenceEqual使用的默认相等比较器是一个,默认使用标准的对象.Equals。但是Lookup.Grouping不会覆盖Equals,因此ObjectEqualityComparer最终使用默认的Object.Equals方法,该方法调用into,该方法(我认为,因为它是外
SequenceEqual
使用的默认相等比较器是一个,默认使用标准的对象.Equals
。但是Lookup.Grouping
不会覆盖Equals
,因此ObjectEqualityComparer
最终使用默认的Object.Equals
方法,该方法调用into,该方法(我认为,因为它是外部的)正在进行引用比较并返回false
我看不出有什么好的理由让粗体部分为真,因此这个问题。是否有人知道(或能够解释)这是一个深思熟虑的设计决策(如果是,原因是什么),或者这仅仅是一个意外遗漏?公开地,查找。分组
只是一个IEnumerable
通常,两个IEnumerable
实例并不因为元素相等而相等
为什么IEnumerable
的这个特定实现应该有所不同?BCL中没有集合覆盖平等成员。这是他们坚持的惯例
为什么??猜测:业绩状况可能令人惊讶。或者,他们认为参考比较更有用。或者,他们发现不可能在任何地方定义适当的相等性(例如,MatchCollection
)。所以他们决定至少保持一致
我不认为I分组
是使用相等方法的特别有用的候选者。这和其他收藏一样有用
为自己编写一个CollectionQualityComparer
,并在任何地方重用它。如果类是可变的,则该类型的任何特定变量或存储位置都可能封装以下任何内容:
宇宙中任何地方对该类实例的唯一引用
对该类实例的引用,禁止所有人修改该实例
对该类实例的引用,可能存在其他引用,但该实例由变量或存储位置的所有者拥有,并且在所有者不知情的情况下不会被修改
一种对该类实例的引用,该类实例由其他人拥有,并且可以在变量或存储位置的所有者不知道的情况下进行修改
在前两种情况下,基于价值的等值通常是合适的。在第三种情况下,它可能合适,也可能不合适(取决于外部引用的语义意义)。在第四种情况下,基于价值的等值是不合适的
不幸的是,即使编写代码的人可以很容易地将几乎所有变量和存储位置划分为上述类别之一,也没有定义机制使编译器或运行时可以使用这些信息。因此,没有一种机制可以在适当的时候使用基于值的等价,而在不适当的时候不使用它。“…两个IEnumerable实例并不因为它们的元素相等而相等。为什么IEnumerable的这个特定实现会有所不同?”当你用这些术语来表述时,这完全有道理。