Ответы пока предполагают, что вы просто ищете дубликаты первичных ключей. Это довольно простая проблема - вы можете использовать метод Merge (), например.
Но я понимаю, что ваш вопрос означает, что вы ищете дубликаты DataRows. (Из вашего описания проблемы, когда обе таблицы импортируются из файлов CSV, я даже предположил, что исходные строки не имели значений первичного ключа и что любые первичные ключи назначались через AutoNumber во время импорта.)
Наивная реализация (для каждой строки в A, сравните ее ItemArray с таковой для каждой строки в B) действительно будет вычислительно дорогой.
Гораздо менее дорогой способ сделать это с помощью алгоритма хеширования. Для каждого DataRow объедините строковые значения его столбцов в одну строку, а затем вызовите GetHashCode () для этой строки, чтобы получить значение типа int. Создайте Dictionary<int, DataRow>
, который содержит запись с ключом хэш-кода для каждого DataRow в DataTable B. Затем для каждого DataRow в DataTable A рассчитайте хеш-код и посмотрите, содержится ли он в словаре. Если это не так, вы знаете, что DataRow не существует в DataTable B.
У этого подхода есть два недостатка, которые оба вытекают из того факта, что две строки могут быть неравными, но выдают одинаковый хэш-код. Если вы найдете в A строку, хэш которой находится в словаре, вам необходимо проверить строку данных в словаре, чтобы убедиться, что две строки действительно равны.
Второй недостаток более серьезен: маловероятно, но возможно, что два разных DataRow в B могут хэшировать одно и то же значение ключа. По этой причине словарь действительно должен быть Dictionary<int, List<DataRow>>
, и вы должны выполнить проверку, описанную в предыдущем абзаце, для каждой строки данных в списке.
Требуется немалое количество работы, чтобы заставить это работать, но это алгоритм O (m + n), который, я думаю, будет таким же хорошим, как и он.