我的应用程序处理一些文本解析并使用适当的名词缓存来减少数据库调用:
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
Saevarsson
并且Sæ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);
如果以 InvariantCulture 方式进行比较,则 s1 和 s2 被视为相等
问题:有没有办法以 InvariantCulture 方式检查字符串键是否存在?如果可能的话,我不想放弃检查密钥存在的 O(1) 复杂性。
我尝试过的事情:
a) 数据库检查- 缓存未命中,在插入缓存之前,还要检查数据库。生成大量查询,因此性能很糟糕
b) 字符串规范化- 使用与此类似的映射将不需要的字符替换为“正常”字符。需要大量工作,我觉得它可以自动化,因为StringComparison.InvariantCulture
知道如何处理这个。
谢谢。