2016-06-19 2 views
0

내 응용 프로그램 일부 텍스트가 해석 처리 및 데이터베이스 호출을 줄이기 위해 고유 명사 캐시를 사용C# 사전 키 조회는

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 서버)

Column_name Type  Collation 
Word   nvarchar Latin1_General_100_CS_AS 
,369 : 그래서 유사한 단어에 대한 중복 키 오류 (SQL)로 실행할 수 있습니다

SaevarssonSæ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가 같은 것으로 간주됩니다.

질문 : chec 할 방법이 있습니까? k는 InvariantCulture 방식으로 문자열 키가 존재할 때 사용합니까? 가능한 경우 키 존재 확인을위한 O (1) 복잡성을 풀고 싶지 않습니다.

상황은 내가 시도 :

가) 데이터베이스 검사 - 캐시 미스를 들어, 캐시에 삽입하기 전에, 또한 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);