我的应用程序处理一些文本正在解析,并使用适当的名词缓存来减少数据库调用:
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);
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);