试图简化这个问题的第三次尝试:
通用的List<T>
可以包含任何类型 - 值类型或引用类型。当检查列表是否包含对象时,.Contains()
使用类型T的默认EqualityComparer<T>
并调用.Equals()
(我的理解是这样的)。如果没有定义EqualityComparer,则默认比较器将调用.Equals()
。默认情况下,.Equals()
调用.ReferenceEquals()
,因此只有在列表中包含完全相同的对象时,.Contains()
才会返回true。
直到你需要覆盖.Equals()
以实现值相等性,此时默认比较器会认为两个对象具有相同的值即相同。我想不出一个引用类型需要这种行为的例子。
@Enigmativity所说的是,实现IEqualityComparer<StagingDataRow>
将为我的类型化DataRow提供一个默认的相等比较器,该比较器将代替Object
的默认比较器 - 允许我在StagingDataRow.Equals()
中实现值相等逻辑。
问题:
- 我理解得对吗?
- 我能保证.NET框架中的所有内容都会调用
EqualityComparer<StagingDataRow>.Equals()
而不是StagingDataRow.Equals()
吗? IEqualityComparer<StagingDataRow>.GetHashCode(StagingDataRow obj)
应该针对什么进行哈希,是否应该返回与StagingDataRow.GetHashCode()
相同的值?- 传递给
IEqualityComparer<StagingDataRow>.GetHashCode(StagingDataRow obj)
的是什么?我要查找的对象还是列表中的对象?两者都有?一个实例方法接受自身作为参数会很奇怪...
一般来说,在覆盖.Equals()
时如何区分值相等性和引用相等性?
引发这个问题的原始代码行:
// For each ID, a collection of matching rows
Dictionary<string, List<StagingDataRow>> stagingTableDictionary;
StagingTableMatches.AddRange(stagingTableDictionary[perNr].Where(row => !StagingTableMatches.Contains(row)));
.
DataRow
继承并覆盖相等性方法吗?还是你计划创建一个自定义的IEqualityComparer
?你在哪里更改了DataRow
中的数据?需要根据值比较DataRows
的代码在哪里? - Yacoub MassadIEqualityComparer<DataRow>
实例并在查询中使用它。 - EnigmativityEnumerable.Contains(
ж–№жі•пјҲhttps://msdn.microsoft.com/en-us/library/bb339118(v=vs.100).aspxпјүпјҢиҝҷж ·е°ұж— йңҖе…іеҝғй»ҳи®ӨжҜ”иҫғеҷЁжҳҜд»Җд№ҲгҖӮ - Scott Chamberlain