我对C#中Contains
的{{1}}方法感到困惑。我有以下代码,当我的表中有重复的行时,行ArrayList
是否返回true?
我把输入写成:
UniqueRecords.Contains(dRow)
所以它有重复的行,
但DataRow sourceRow = myTable.Rows[1];
myTable.ImportRow(sourceRow);
不会返回true。有什么帮助吗?
UniqueRecords.Contains(dRow)
答案 0 :(得分:1)
ArrayList
类将使用相关对象的Equals
方法来比较它们。碰巧Equals
DataRow
方法实际上没有比较行中所有列的值,只是比较了对该行的引用。这意味着具有相同数据的两个不同行不等于"根据该类型,并因此ArrayList
。
您可以创建一个能够使用您自己的相等定义的IEqualityComparer<DataRow>
,然后List<DataRow>
可以使用Contains
的额外重载接受IEqualityComparer<DataRow>
{1}}。更好的是,您可以使用HashSet
代替List
,因为它可以比List
更快地进行搜索。
事实上,在这种特殊情况下,您甚至不需要自己编写比较器,语言已经存在:DataRowComparer。它专门用于提供基于价值的平等,这是您想要的。
答案 1 :(得分:0)
它完全取决于ArrayList如何比较列表中的两个对象。当这个数据结构要求比较器比较两个对象的引用(对于引用类型对象)时,因为两个所谓的相同行具有不同的引用,它们被比较器感知不相等,尽管它们在每列中具有相同的值。 p>