[C#] C #에서 문자열 키 유형의 대소 문자 구분 사전

내가 있다면 대소 문자를 구분하지 않는 Dictionary<String,...>방법을 만들 수 ContainsKey있습니까?

이것은 관련이있는 것처럼 보였지만 제대로 이해하지 못했습니다 : c # Dictionary : 선언을 통해 키를 대소 문자를 구분하지 않습니다



답변

이것은 관련이있는 것처럼 보였지만 제대로 이해하지 못했습니다 : c # Dictionary : 선언을 통해 키를 대소 문자를 구분하지 않습니다

실제로 관련이 있습니다. 해결책은 사전 인스턴스에 표준 문자열 비교 방법 (대소 문자 구분)을 사용하지 말고 대소 문자를 구분하지 않는 것입니다. 이것은 적절한 생성자를 사용하여 수행됩니다 .

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

생성자는 IEqualityComparer키를 비교하는 방법을 사전에 알려주 는를 기대 합니다.

StringComparer.InvariantCultureIgnoreCaseIEqualityComparer대소 문자를 구분하지 않고 문자열을 비교 하는 인스턴스를 제공합니다 .


답변

var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);


답변

타사 또는 외부 dll에서 가져온 사전을 다루는 경우는 거의 없습니다. linq 사용

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))


답변

ASP.NET Core 컨트롤러에서 caseINsensitive 사전이 필요한 동일한 종류의 문제가 발생했습니다.

트릭을 수행하는 확장 방법을 작성했습니다. 아마도 이것은 다른 사람들에게도 도움이 될 수 있습니다 …

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

확장 방법을 사용하려면

myDictionary.ConvertToCaseInSensitive();

그런 다음 사전을 사용하여 값을 가져옵니다.

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");


답변

인스턴스 생성을 제어 할 수없는 경우 객체가 json 등으로부터 desterilized되었다고 가정하면 사전 클래스에서 상속되는 래퍼 클래스를 만들 수 있습니다.

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}


답변