Поиск ключа в словаре C# способом InvariantCulture

Мое приложение обрабатывает некоторые текстовые разборы и использует надлежащий кеш существительного для сокращения вызовов базы данных:

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 это то же самое с точки зрения базы данных, и это нормально для меня, так как слова, содержащие символы very, очень редко встречаются в разобранных текстах:

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 рассматриваются как равные, если сравнение выполняется способом InvariantCulture

Вопрос: есть ли способ проверить существование строкового ключа способом InvariantCulture? Я не хочу терять свою O(1) сложность проверки существования ключа, если это возможно.

Вещи, которые я пробовал:

а) Проверка базы данных - при отсутствии кеша перед вставкой в ​​кеш также проверяйте в БД. Генерирует много запросов, поэтому производительность ужасна

б) Нормализация строк - замените нежелательные символы на "нормальные", используя карту, подобную этой. Требуется много работы, и я чувствую, что это может быть автоматизировано, так как StringComparison.InvariantCulture знает, как с этим бороться.

Благодарю.

2 ответа

Когда вы инициализируете свой словарь, вы можете использовать конструктор с IEqualityComparer<TKey>:

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

В этом случае ваши ключи будут сравниваться с использованием инвариантной культуры. Вы также можете использовать другие сравнения строк, в зависимости от ваших потребностей.

Используйте этот конструктор для создания словаря.

Dictionary<String, ProperNoun> ProperNounsDict = new Dictionary<String, ProperNoun>(StringComparer.InvariantCulture);
Другие вопросы по тегам