[英]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.