code

C # 사전 : 선언을 통해 키 대 / 소문자를 구분하지 않도록 만들기

codestyles 2020. 11. 2. 08:00
반응형

C # 사전 : 선언을 통해 키 대 / 소문자를 구분하지 않도록 만들기


나는이 Dictionary<string, object>사전을. 예전 Dictionary<Guid, object>에는 그랬지만 다른 '식별자'가 작동하고 이제 키는 문자열로 처리됩니다.

문제는 Guid내 소스 데이터 키가으로 나오기 VarChar때문에 이제 키 "923D81A0-7B71-438d-8160-A524EA7EFA5E""923d81a0-7b71-438d-8160-a524ea7efa5e"(Guid를 사용할 때 문제가되지 않았습니다) 와 동일 하지 않습니다.

.NET 프레임 워크에 대해 정말 멋지고 좋은 점은 다음과 같이 할 수 있다는 것입니다.

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);

그리고 그것은 훌륭하게 작동합니다. 하지만 중첩 된 사전은 어떻습니까? 다음과 같이 :

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();

이와 같은 중첩 사전에 문자열 비교자를 어떻게 지정합니까?


당신이 외부 사전에 요소를 추가 할 때, 당신은 가능성이 중첩 된 사전의 새 인스턴스를 만들거야 사용하고,이 시점에서 추가 오버로드 된 생성자 됩니다 IEqualityComparer<TKey>.

_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));


업데이트 08/03/2017 : 일화로, StringComparer.OrdinalIgnoreCase문자의 대소 문자를 무시하고 싶을 때 더 효율적인 어딘가를 읽었습니다 ( "고성능 .NET 코드 작성"에서 생각 합니다). 그러나 이것은 YMMV이므로 완전히 근거가 없습니다.


중첩 된 사전을 사용하려면 초기화해야합니다. 그 시점에서 위에있는 코드를 사용하십시오.

기본적으로 다음과 같은 코드가 있어야합니다.

public void insert(int int_key, string guid, CustomClass obj)
{
    if (_customRecordSet.ContainsKey(int_key)
         _customRecordSet[int_key][guid] = obj;
    else
    {
         _customRecordSet[int_key] = new Dictionary<string, CustomClass> 
                                     (StringComparer.InvariantCultureIgnoreCase);
         _customRecordSet[int_key][guid] = obj;
    }
}

참고 URL : https://stackoverflow.com/questions/6676245/c-sharp-dictionary-making-the-key-case-insensitive-through-declarations

반응형