簡體   English   中英

比較 C# 中的哈希表鍵不區分大小寫

[英]Compare HashTable Keys in C# case-insensitively

我有兩個文件,數據庫文件和一個我必須比較的新文件。 數據庫文件中不存在但新文件中的值將被進一步處理。

我正在為數據庫和新文件使用 hash 表,其中鍵/值對的格式為 -

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

我得到以下 output

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

但它不工作。 請向我建議一些我不必在應用程序中進行重大更改的東西。

最簡單的方法是在新舊 collections 上執行完全外連接並找到差異,就像在任何類似 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);

未編譯,僅由 memory 編譯。 這種方法的好處是您可以完全同步兩個 collections:查找第一個中缺少的內容,密鑰已經存在的內容以及第二個中缺少的內容(意味着需要刪除)。 您獲得了完整的創建、更新、刪除同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM