簡體   English   中英

不區分大小寫的字典無法按預期工作

[英]Case-Insensitive dictionary not working as expected

我正在從 OsiSoft “PI”系統的字典中緩存一些數據,並通過字符串鍵對其進行索引。 鍵來自不同系統中的用戶輸入,並且大小寫混合。 OsiSoft 系統鍵不區分大小寫,所以我的字典也需要不區分大小寫。 但是,字典沒有按預期工作。

字典定義如下:

Dictionary<string, PIPoint> PointsDictionary = new Dictionary<string, PIPoint>(StringComparer.CurrentCultureIgnoreCase);

它是從派生自 IList 的 OsiSoft 結構返回的結構中填充的

PointsDictionary = RegisteredPoints.ToDictionary(x => x.Name, x => x);

當我嘗試從字典中返回 PIPoint 值時,它沒有按預期工作。 我想以小寫、大寫或混合大小寫傳遞密鑰,並獲得相同的值。

    public PIPoint GetPoint(string tag)
    {
        //sfiy-1401a/c6
        //SFIY-1401A/C6
        Debug.WriteLine("sfiy-1401a/c6" + ": " + PointsDictionary.ContainsKey("sfiy-1401a/c6"));
        Debug.WriteLine("SFIY-1401A/C6" + ": " + PointsDictionary.ContainsKey("SFIY-1401A/C6"));
        Debug.WriteLine("Match?" + ": " + "SFIY-1401A/C6".Equals("sfiy-1401a/c6", StringComparison.CurrentCultureIgnoreCase));
        if (tag == null || !PointsDictionary.ContainsKey(tag)) return null;
        return PointsDictionary[tag];
    }

運行上述程序時來自調試器的 Output:

sfiy-1401a/c6:錯誤

SFIY-1401A/C6:真

匹配?:是的

我是否從根本上誤解了不區分大小寫的字典的工作方式,或者我填充它的方式有什么(轉換 IList.ToDictionary()),這意味着它沒有按預期工作?

該字典被定義為不區分大小寫,但隨后您將用區分大小寫的字典覆蓋它。

// definition 
Dictionary<string, PIPoint> PointsDictionary = new Dictionary<string, PIPoint>(StringComparer.CurrentCultureIgnoreCase);

// later *reassignment*
PointsDictionary = RegisteredPoints.ToDictionary(x => x.Name, x => x);

你看,你正在替換這個值,當你覆蓋這個值時,原來的比較器就丟失了 調用ToDictionary時需要再次指定比較器。 幸運的是,有一個重載需要一個關鍵比較器:

PointsDictionary = RegisteredPoints.ToDictionary(x => x.Name, x => x, StringComparer.CurrentCultureIgnoreCase);

請注意, ToDictionary也有采用鍵選擇器(和比較器)的重載,因此您可以簡化為:

PointsDictionary = RegisteredPoints.ToDictionary(x => x.Name, StringComparer.CurrentCultureIgnoreCase);

您甚至可以傳遞Comparer的比較器,這樣您就不必確切地記住它是什么類型:

PointsDictionary = RegisteredPoints.ToDictionary(x => x.Name, PointsDictionary.Comparer);

或者,您可以清除字典並重新添加所有項目,這將保留原始比較器:

PointsDictionary.Clear():
foreach(var p in RegisteredPoints) 
   PointsDictionary[p.Name] = p:

暫無
暫無

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

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