Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不敏感地比较C#大小写中的哈希表键_C#_Hashtable - Fatal编程技术网

不敏感地比较C#大小写中的哈希表键

不敏感地比较C#大小写中的哈希表键,c#,hashtable,C#,Hashtable,我有两个文件,数据库文件和一个新文件,我要比较。将进一步处理数据库文件中不存在但新文件中存在的值 我正在为数据库和新文件使用哈希表,其中键/值对的格式为- ("ABC,12","12,ABC") 问题是我无法正确执行哈希表比较。例如,如果我的数据库文件的哈希表具有以下值- ("ABC,12","12,ABC") ("XYZ,Sample","Sample,XYZ") 并且新文件具有值 ("ABC,12","12,ABC") ("ABC,20","20,ABC") ("XYZ,SAMPLE",

我有两个文件,数据库文件和一个新文件,我要比较。将进一步处理数据库文件中不存在但新文件中存在的值

我正在为数据库和新文件使用哈希表,其中键/值对的格式为-

("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();

但它不起作用。
请给我推荐一些我不需要在申请中做重大更改的东西

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

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

KeyValueinNewFile的值是多少??KeyValueinNewFile具有字符串值。例如,“XYZ,SAMPLE”在您的示例中显示
(“ABC,12”,“12,ABC”)
,这是1个条目还是2个条目。k:“ABC”v:“12”和k:“12”v:“ABC”?或者k:“ABC,12”v:“12,ABC”?另外,我不清楚区分大小写和它有什么关系,所有的例子都是大写的?为什么是哈希表?在我看来,
字典
(或者可能只是一个
哈希集
)在这里就可以了;您可以将
StringComparer
(例如
OrdinalInoreCase
)传递给该(那些)的构造函数@EamonnMcEvoy键为“XYZ,SAMPLE”,值为“SAMPLE,XYZ”。需要区分大小写,因为数据库具有(“XYZ,Sample”,“Sample,XYZ”)。示例是小写的,但在新文件中示例是大写的。理想情况下,在比较中应该忽略它。谢谢您的回答,但如果您能建议如何仅使用哈希表进行比较,因为它们仅适用于场景。哈希集接受定制的IEqualityComparer,以比较表中的值,这将非常有帮助。只需添加case-insensive comparer-var hs=new HashSet(StringComparer.invariantCultureInogoreCase);然而,我要指出的是,完全连接是同步任务的常见做法,它也更聪明。此扩展是处理某种1-1链接数据时最常用的扩展之一。
//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);