Я читаю данные из файлов (например, CSV и Excel) и должен гарантировать, что каждая строка в файле уникальна.Проверка уникальности для массива объектов
Каждая строка будет представлена как object[]
. Это невозможно изменить из-за текущей архитектуры. Каждый объект в этом массиве может быть разного типа (decimal
, string
, int
и т. Д.).
Файл может выглядеть следующим образом:
foo 1 5 // Not unique
bar 1 5
bar 2 5
foo 1 5 // Not unique
Файл может иметь 200.000+ строк и столбцов 4-100.
код я прямо сейчас выглядит следующим образом:
IList<object[]> rows = new List<object[]>();
using (var reader = _deliveryObjectReaderFactory.CreateReader(deliveryObject))
{
// Read the row.
while (reader.Read())
{
// Get the values from the file.
var values = reader.GetValues();
// Check uniqueness for row
foreach (var row in rows)
{
bool rowsAreDifferent = false;
// Check uniqueness for column.
for (int i = 0; i < row.Length; i++)
{
var earlierValue = row[i];
var newValue = values[i];
if (earlierValue.ToString() != newValue.ToString())
{
rowsAreDifferent = true;
break;
}
}
if(!rowsAreDifferent)
throw new Exception("Rows are not unique");
}
rows.Add(values);
}
}
Итак, мой вопрос, можно ли это сделать более эффективно? Например, использование хэшей и проверка уникальности хэша вместо этого?
Вы понимаете, что возможно, что два объекта имеют одинаковый хеш и по-прежнему неравны, не так ли? Другими словами, если ваш хеш сделан правильно, файл может иметь повторяющиеся хэши, но все равно иметь уникальные строки. – phoog
Как насчет использования HashSet с пользовательским сопоставлением равенства? –
Jehof
@phoog, да, я хорошо знаю об этом. Решение сначала проверит хэш, и если хеши будут равны, ему придется также проверять и другие значения. Но, возможно, лучше проверить хэш сначала, а не всегда проверять все значения. – smoksnes