Сравните ключи HashTable в C# без учета регистра - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть два файла, файл базы данных и новый файл, который я должен сравнить. Значения, которых нет в файле базы данных, но есть в новом файле, обрабатываются далее.

Я использую таблицы ha sh как для базы данных, так и для нового файла, в котором пары ключ / значение имеют формат -

("ABC,12","12,ABC")

Проблема в том, что я не могу выполнить хеш-таблицу Сравнение правильно. Например, если хеш-таблица моего файла базы данных имеет следующие значения -

("ABC,12","12,ABC")
("XYZ,Sample","Sample,XYZ")

, а новый файл имеет значения

("ABC,12","12,ABC")
("ABC,20","20,ABC")
("XYZ,SAMPLE","SAMPLE,XYZ")

, используя следующий код

if (!_database.ContainsKey(KeyValueinNewFile)

Я получаю следующий вывод

("ABC,20","20,ABC")
("XYZ,SAMPLE","SAMPLE,XYZ")

Это должно быть только

 ("ABC,20","20,ABC")

Я также использовал

Hashtable ht = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();

и

Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);

но это не работает. Пожалуйста, предложите мне что-то, в чем мне не нужно вносить серьезные изменения в приложение.

1 Ответ

0 голосов
/ 12 апреля 2020

Самый простой подход - просто выполнить полное внешнее объединение старых и новых коллекций и найти разницу так же, как в любом SQL -подобном синтаксисе (см. Ответ @sehe):

LINQ - полное внешнее объединение

Пример:

//see, you can pass comparer inside, it also uses hashtables for performance inside.
var fjoin = _database.FullOuterJoin(newFile, x=> x, x=> x, (x,y,key)=> new {oldObj = x, newObj = y}, cmp: StringComparer.InvariantCultureIgnoreCase);

var toFurtherProcess = fjoin.Where(x=> x.oldObj == null);

Не скомпилировано, только по памяти. Преимущество этого подхода заключается в том, что вы можете полностью синхронизировать c две коллекции: найти то, что отсутствует в первой, то, что уже присутствует по ключу, и то, что отсутствует во второй (средства должны быть удалены). Вы получили полное создание, обновление, удаление syn c.

...