2010-04-22 4 views
4

면책 조항 : 어쩌면사전 <string,T> (StringComparer) 대 사전 <string,T> 및 키를 저장합니다. 다음 중 어떤 것을 선호합니까?

문제는 대소 문자를 구분하지 조회 테이블을 구현하는 것입니다 .. 마이크로 YAGNI가-최적화 그러나 저를들을 수.

  • 내 옛날 방식 : 사전을 채우는 동안 삽입하기 전에 대문자로 입력하십시오. 어떤 사람이 당신에게 조회 할 키를 줄 때 대문자.
  • 새로운 방법 (오늘 배웠습니다) : Dictionary는 IComparer 구현을 사용하므로 StringComparer.InvariantCultureIgnoreCase을 전달할 수 있습니다. 나는 String.Compare (X, Y, SomeIgnoreCaseEnum)이 새로운 방법은 내가 .ToUpper가()은 n의 각에서 수행되도록 할 필요가 없다는 점에서 장점이있다

에 위임 할 것이라고 생각 사전에 대해 조회가 수행되는 장소.

제 질문은 어떤 것이 더 효율적입니까? 그냥 궁금해서 ...

업데이트 : 참고 삽입 된 원래 키는 알 필요가 없습니다. 또한 사용되는 키는 문화에 무관심합니다.

+1

자신의 마이크로 벤치 마크를 작성하십시오 (각 유형을 100,000 번 실행하고 가변 조건을 설명하기 위해 3 번 타이밍 지정). – Oded

+0

명심해야 할 점이 하나 있습니다. 어떤 시점 (예 : 인쇄)에서 원래 형식으로 키가 필요한 경우 첫 번째 옵션이 최적이 아닙니다. –

+0

@Brian - 네가 사용하는 것을 잊어 버렸다. 유스 케이스는 대소 문자를 구별하지 않으며 문화에 독립적이다. – Gishu

답변

1

확인하십시오. entry. 오늘은 여전히 ​​유효합니다.

발췌 : MSDN의 그것은 그 다음 서수 비교를 할 수 있기 때문에 상단 케이스는보다 효율적인 것 이다 "New Recommendations for Using Strings in Microsoft .NET 2.0"

+0

해당 페이지의 4 번째 및 5 번째 DO가 나를 혼란스럽게합니다 - 그들은 무엇을 추천합니까? '언어 학적으로 의미가있는'것은 무엇을 의미합니까? – Gishu

+0

그들은 좀 더 자세히 설명합니다 : http://msdn.microsoft.com/en-us/library/ms973919.aspx#stringsinnet20_topic5 – ntziolis

3

...하지만이 성능 병목 현상이 있음을 나는 매우 의심부터 너를 위해서. 이전과 마찬가지로 실적을 기준으로 코드를 변경하기 전에 프로필을 작성하십시오.

궁극적으로, 문자열 비교를 지정 :

  • 당신이 단적으로 도움이 될 수 있습니다
  • 원래 케이스가 키 유지 수단 사전을 사용하는 방법에 대한 같은주의 할 필요가 없습니다 의미 경우에 따라
  • 키를 처리하는 방법을 명시 적으로 말합니다. 창조의 시점에서 한 번만 말하면 결국 더 명확한 코드가됩니다.
+0

예. 장소 전체에서 ToUpper()를 수행하는 번거 로움이 없습니다. – Gishu

1

성능에 대해서는 잘 모르겠지만 StringComparer 옵션을 선호합니다. ToUpper를 사용하면 정보가 손실됩니다 (원래 케이스). 당신이 그것을 필요로하지 않을 수도 있겠지만, 언젠가는 당신이 그것을 할 수있는 더 이상의 일처럼 느껴지지 않을 것입니다 (따라서 YAGNI 원칙으로부터 안전합니다).

언젠가는 ToUpper에 전화를해서 상처를 입는 것을 잊지 않을 것입니다. 하지만 단위 테스트는 물론 저를 구할 수 있습니다.

+0

. 단위 테스트가 있습니다. 그래서 한 곳에서 잊어 버리면 너무 오래 다 치지 않을 것입니다. 다음 테스트가 끝날 때까지. – Gishu

0

나는 Oded의 'Go profile!'을 받아 들였습니다. comment : Master-of-the-명백한 제안이었습니다.내 테스트에서

(source code here)

100 만 ContainsKey 조회에

,

  • 의 ToUpper 방법 : 1123 밀리
  • 사전 (OrdinalIgnoreCaseComparer) : 971 밀리 초

나는 사전을 찾아 주입 된 Comparer 옵션을 사용하면 더 효율적이고 적은 번거 로움을 피할 수 있습니다. ToUpper()는 더 이상 필요하지 않습니다.

관련 문제