programing

KeyNotFoundException을 처리하는 가장 좋은 방법

nasanasas 2020. 12. 6. 21:39
반응형

KeyNotFoundException을 처리하는 가장 좋은 방법


작업중인 프로그램에 대한 조회를 수행하기 위해 사전을 사용하고 있습니다. 사전을 통해 여러 키를 실행하고 일부 키에 값이 없을 것으로 예상합니다. 나는 KeyNotFoundException그것이 발생하는 곳을 바로 잡고 그것을 흡수합니다. 다른 모든 예외는 맨 위로 전파됩니다. 이것이이를 처리하는 가장 좋은 방법입니까? 아니면 다른 조회를 사용해야합니까? 사전은 int를 키로 사용하고 사용자 정의 클래스를 값으로 사용합니다.


사용 Dictionary.TryGetValue하는 대신 :

Dictionary<int,string> dictionary = new Dictionary<int,string>();
int key = 0;
dictionary[key] = "Yes";

string value;
if (dictionary.TryGetValue(key, out value))
{
    Console.WriteLine("Fetched value: {0}", value);
}
else
{
    Console.WriteLine("No such key: {0}", key);
}

사용해보십시오 : Dict.ContainsKey

편집 :
성능 현명한 Dictionary.TryGetValue것은 다른 제안처럼 더 낫다고 생각 하지만 내 의견으로는 ContainsKey가 더 읽기 쉽지만 값이 필요한 경우 더 많은 코드 줄이 필요하면 Out을 사용하고 싶지 않습니다.


사용하는 한 줄 솔루션 TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!";

주의하십시오 변수 유형이 경우에 사전을 반환해야합니다 문자열 . 여기서 변수 선언에 var사용할 수 없습니다 .

당신은 C # 7 사용하고있는 경우에 당신이 만약 CAN var에 포함 인라인을 정의 :

string value = dictionary.TryGetValue(key, out var tmp) ? tmp : "No key!";

여기에 한 줄 솔루션이 있습니다 (조회가 두 번 생성된다는 점을 명심하십시오. 장기 실행 루프에서 사용해야하는 tryGetValue 버전은 아래를 참조하십시오.)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";

하지만 사전에 액세스 할 때마다이 작업을 수행해야합니다. 다음과 같이 쓸 수 있도록 null을 반환하는 것이 좋습니다.

string value = dictionary[key] ?? "default";//this doesn't work

키가 존재하는지 확인하려면 Dictionary의 'ContainsKey (string key)'메소드를 사용해야합니다. 정상적인 프로그램 흐름에 예외를 사용하는 것은 좋은 습관으로 간주되지 않습니다.


나는 이것이 오래된 스레드라는 것을 알고 있지만 도움이되는 경우 이전 답변이 훌륭하지만 코드를 버리는 복잡성과 우려에 대한 의견 (모두 나에게도 유효 함)을 해결할 수 있습니다.

사용자 지정 확장 메서드를 사용하여 위의 답변의 복잡성을 더 우아한 형식으로 래핑하여 코드 전체에 흩어져 있지 않도록 한 다음 null 병합 연산자를 크게 지원할 수 있습니다. . . 성능을 극대화하는 동시에 (위의 답변을 통해).

namespace System.Collections.Generic.CustomExtensions
{
    public static class DictionaryCustomExtensions
    {
        public static TValue GetValueSafely<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
        {
            TValue value = default(TValue);
            dictionary.TryGetValue(key, out value);
            return value;
        }
    }
}

그런 다음 System.Collections.Generic.CustomExtensions 네임 스페이스를 가져 와서 간단히 사용할 수 있습니다.

string value = dictionary.GetValueSafely(key) ?? "default";

참고 URL : https://stackoverflow.com/questions/606636/best-way-to-handle-a-keynotfoundexception

반응형