c# - 不区分大小写地比较 C# 中的 HashTable 键
问题描述
我有两个文件,数据库文件和一个我必须比较的新文件。数据库文件中不存在但新文件中的值将被进一步处理。
我正在为数据库和新文件使用哈希表,其中键/值对的格式为 -
("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);
但它不工作。请向我建议一些我不必在应用程序中进行重大更改的东西。
解决方案
最简单的方法是对旧集合和新集合执行完全外连接并找出差异,就像在任何类似 SQL 的语法中所做的一样(参见@sehe 的答案):
例子:
//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);
没有编译,只是通过内存。这种方法的好处是您可以完全同步两个集合:查找第一个集合中缺少的内容,按键已经存在的内容以及第二个集合中缺少的内容(意味着需要删除)。您获得了完整的创建、更新、删除同步。
推荐阅读
- tizen - 由于签名错误,设备上的应用程序安装失败 - tizen studio
- android - 运行牛轧糖的华为手机出现安全异常
- javascript - 如何检查日期时间?
- javascript - const path = require('path') -- 意外标识符
- java - 使用可选映射和过滤器重写 if 语句
- django - 有人可以解释为什么我需要在 Django 中引用两个模型吗?
- javascript - 使用用户输入更改或更新复选框值
- python - 我无法使用 python 删除列表中的重复行
- java - 登录时可以创建表抛出 MS SQL 管理工作室,但不能通过 jdbc 与同一用户
- php - WP SMTP 插件未读取 wp-config 常量变量