2016-06-19 2 views
0

私のアプリケーションは、いくつかのテキストが構文解析を処理し、データベースを減らすために固有名詞キャッシュを使用しています呼び出します。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#の御馳走平等です2014

1)データベース(SQL Serverなど)

Column_name Type  Collation 
Word   nvarchar Latin1_General_100_CS_AS 
:ので、私は似た単語の重複キーエラー(SQL)に実行することができます

SaevarssonSævarssonは、データベースの観点から、同じものであり、文字を含む単語はAEが解析されたテキストでは非常に稀であるので、それは、私にとっては結構です:

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は等しいと見なされます。

質問:checする方法はありますかInvariantCultureの方法で文字列キーの存在を確認するには?可能であれば、私のO(1)キーの存在をチェックする複雑さを解消したくありません。私が試してみました

もの:

a)のデータベースチェック - キャッシュミスのため、キャッシュに挿入する前には、また、DBに確認してください。クエリの多くを生成し、そのパフォーマンスはひどいです

b)の文字列の正規化からthis oneに似たマップを使用して「ノーマル」なものとの望ましくない文字を置換。多くの作業が必要で、StringComparison.InvariantCultureがこれに対処する方法を知っているので、自動化できると感じています。

ありがとうございました。あなたは辞書を初期化すると

+0

新しい辞書を作成し、 'StringComparer.InvariantCulture'をコンストラクタに渡すことができます... O(1) –

答えて

3

することは、あなたはIEqualityComparer<TKey>でコンストラクタを使用することができます。

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

この場合、あなたの鍵は、インバリアントカルチャを使用して比較されます。必要に応じて他のstring comparersも使用できます。

+0

はい。それはまさに私が必要とするものです。私の場合、初期化はデータベースから行われます: 'UnitOfWork.ProperNounRepository.AllNoTracking.ToDictionary(pn => pn.Word、pn => pn、StringComparer.InvariantCulture));'。ありがとうございました。 – Alexei

2

辞書を作成するためにこのコンストラクタを使用します。

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