0

我对C# 中的Contains方法感到困惑。ArrayList我有以下代码,UniqueRecords.Contains(dRow)当我的表中有重复行时,该行是否返回 true?

我将输入写为:

DataRow sourceRow = myTable.Rows[1];
myTable.ImportRow(sourceRow);

所以它有重复的行,但UniqueRecords.Contains(dRow)不返回true。有什么帮助吗?

ArrayList UniqueRecords = new ArrayList();
ArrayList DuplicateRecords = new ArrayList();

foreach (DataRow dRow in myTable.Rows)
{
    if (UniqueRecords.Contains(dRow))
    {
        DuplicateRecords.Add(dRow);
    }
    else
    {
        UniqueRecords.Add(dRow);
    }
}
4

2 回答 2

1

该类ArrayList将使用相关Equals对象的方法来比较它们。碰巧的Equals方法DataRow实际上并没有比较行中所有列的值,它只是比较对该行的引用。这意味着根据该类型,具有相同数据的两个不同行不“相等”,因此ArrayList.

您可以创建一个IEqualityComparer<DataRow>能够使用您自己的相等定义的,然后可以由一个List<DataRow>具有额外重载的a 使用,该重载Contains接受一个IEqualityComparer<DataRow>. 更好的是,您可以使用 aHashSet而不是 a List,因为它可以比 a 更快地进行此类搜索List

事实上,在这种特殊情况下,您甚至不需要自己从头开始编写比较器,语言中已经存在一个:DataRowComparer。它专为提供基于价值的平等而设计,这正是您想要的。

于 2013-09-17T17:10:01.507 回答
0

这完全取决于 ArrayList 如何比较其列表中的两个对象。当此数据结构要求比较器比较两个对象的引用(对于引用类型对象)时,因为您的两个假定相同的行具有不同的引用,所以比较器认为它们不相等,尽管它们在每一列中具有相同的值。

于 2013-09-17T17:08:35.320 回答