首页 > 解决方案 > 不区分大小写地比较 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);

但它不工作。请向我建议一些我不必在应用程序中进行重大更改的东西。

标签: c#hashtable

解决方案


最简单的方法是对旧集合和新集合执行完全外连接并找出差异,就像在任何类似 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);

没有编译,只是通过内存。这种方法的好处是您可以完全同步两个集合:查找第一个集合中缺少的内容,按键已经存在的内容以及第二个集合中缺少的内容(意味着需要删除)。您获得了完整的创建、更新、删除同步。


推荐阅读