Поиск ключа в словаре 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);