0

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

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知道如何处理这个。

谢谢。

4

2 回答 2

4

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

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

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

于 2016-06-19T05:29:59.760 回答
2

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

Dictionary<String, ProperNoun> ProperNounsDict = new Dictionary<String, ProperNoun>(StringComparer.InvariantCulture);
于 2016-06-19T05:33:01.610 回答