C#字典密钥查找以不变性的方式



我的应用程序处理一些文本正在解析,并使用适当的名词缓存来减少数据库调用:

Dictionary<String, ProperNoun> ProperNounsDict;
if (!ProperNounsDict.ContainsKey(word))
{
    var newProper = new ProperNoun() { Word = word  };
    ProperNounsDict.Add(word, newProper);
    UnitOfWork.ProperNounRepository.Insert(newProper);
    try
    {
        UnitOfWork.SaveChangesEx();
    }
    catch (Exception ex)
    {
         // 
    }
}

问题是数据库和C#以不同的方式处理字符串的平等,因此我可以遇到相似单词的重复键错误(SQL):

1)数据库(SQL Server 2014)

Column_name  Type       Collation
Word         nvarchar   Latin1_General_100_CS_AS
从数据库角度来看,

SaevarssonSævarsson是同一件事,对我来说很好,因为包含字符æ的单词在解析文本中很少见:

select * from dict.ProperNoun where Word = N'Saevarsson'  -- returns both Saevarsson and Sævarsson

2)C#

string s1 = "Sævarsson";
string s2 = "Saevarsson";
bool equals = s1.Equals(s2, StringComparison.InvariantCulture);

s1和s2被认为是平等的,如果以不变的方式进行比较

问题:是否有一种方法可以以不变性的方式检查字符串键的存在?我不想失去我的O(1)检查键存在的复杂性,如果可能的话,/p>

我尝试过的事情:

a)数据库检查 - 对于缓存错过,在插入缓存之前,还要检查DB。产生很多查询,因此性能很糟糕

b)字符串归一化 - 使用与此相似的地图替换"正常"字符。需要大量的工作,我觉得它可以自动化,因为StringComparison.InvariantCulture知道如何处理。

谢谢。

初始化字典时,可以使用 IEqualityComparer<TKey>的构造函数:

Dictionary<String, ProperNoun> ProperNounsDict = 
    new Dictionary<String, ProperNoun>(StringComparer.InvariantCulture);

在这种情况下,使用不变文化比较您的密钥。您也可以使用其他字符串比较,具体取决于您的需求。

使用此构造函数来创建字典。

Dictionary<String, ProperNoun> ProperNounsDict = new Dictionary<String, ProperNoun>(StringComparer.InvariantCulture);

最新更新