2013-09-17 6 views
0

Я запутался с Contains методом ArrayList в C#. У меня есть следующий код, возвращает ли строка UniqueRecords.Contains(dRow) true, если в моей таблице есть повторяющиеся строки?Применение ArrayList Содержит метод DataRow

я написал вход как:

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

поэтому имеет повторяющиеся строки, но UniqueRecords.Contains(dRow) не возвращает истину. Любая помощь?

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); 
    } 
} 
+2

Во-первых, вы действительно не должны использовать пост 'ArrayList' C# 1.1. Вместо этого используйте «Список ». – Servy

+0

Спасибо! Я обновлю свой код и посмотрю, работает ли он:) – Helen

ответ

1

Класс ArrayList будет использовать метод Equals соответствующих объектов для их сравнения. Так получилось, что метод EqualsDataRow фактически не сравнивает значения всех столбцов в строке, он просто сравнивает ссылку на эту строку. Это означает, что две разные строки с одинаковыми данными не являются «равными» в соответствии с этим типом и, следовательно, ArrayList.

Вы можете создать IEqualityComparer<DataRow>, который может использовать собственное определение равенства, которое затем может быть использован в List<DataRow>, который имеет дополнительную перегрузку Contains, которая принимает IEqualityComparer<DataRow>. Еще лучше, вы можете использовать HashSet вместо List, так как он может делать такой поиск намного быстрее, чем List.

Фактически, в этом конкретном случае вам даже не нужно писать сравнитель самостоятельно с нуля, один уже существует на языке: DataRowComparer. Он специально разработан для обеспечения равенства на основе ценности, чего вы хотите.

+0

Hi Servy, я написал свой собственный компаратор, но похоже, что он не работает очень хорошо. Можете ли вы, пожалуйста, посмотреть? Я узнал C# со вчерашнего дня и смущен. – Helen

+0

код выше под обновленным: thx много !! – Helen

0

Это полностью зависит от того, как ArrayList сравнивает два объекта в своем списке. Когда эта структура данных запрашивает компаратор для сравнения ссылок двух объектов (для объектов ссылочного типа), так как ваши две якобы одинаковые строки имеют разные ссылки, они не воспринимаются компаратором равными, хотя они имеют одинаковые значения в каждом столбце.

+0

Это не поведение 'ArrayList'. 'ArrayList' просто использует метод' Equals' самих объектов; именно эти объекты определяют, что означает «равенство». – Servy

Смежные вопросы