2015-01-29 2 views
2

, 나는 DICT를 가지고 있고, 나는 키가 나는 같은 것을 할 줄 존재하지 않을 수 딕셔너리에서 값을 얻으려면 :C# 사전 파이썬의 GET에 해당() 메소드 파이썬에서

lookupValue = somedict.get(someKey, someDefaultValue) 

여기서 someKey이없는 경우 someDefaultValue이 반환됩니다. C#에서

은 좀 유사하다 TryGetValue()있다 :

: 당신이 널 검사에 넣어 있도록이 생각에

var lookupValue; 
if(!somedict.TryGetValue(someKey, lookupValue)) 
    lookupValue = someDefaultValue; 

하나 잡았다는 someKey 다음 null 경우 예외가 발생됩니다 있다는 것입니다

var lookupValue = someDefaultValue; 
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue)) 
    lookupValue = someDefaultValue; 

TBH가 칙칙합니다 (dict 조회의 경우 3 줄입니까?) 파이썬의 get()과 같은 더 간결한 (즉 1 줄) 방법이 있습니까?

+0

Afaik 그런 식으로 존재하지 않습니다. 하지만이 세 줄을 감싸기 위해 항상 자신 만의 확장을 정의 할 수 있습니다. 아니면 삼자를 사용하여 하나의 라이너를 만들 수도 있지만 접근 방식과 다르지 않습니다. – Andrei

+0

제 3의 튜토리얼은 여전히 ​​하나의 라이너가 아닙니다. 여러분이''lookupValue''를 선언하기 전에' ''TryGetValue'''가 맞습니까? –

+0

'var lookupValue = someKey! = null? somedict.TryGetValue (someKey, someDefaultValue) : someDefaultValue;'내가 뭔가를 놓치지 않는 한.그러나 다시 한번, 전혀 멋지게 보입니다. – Andrei

답변

4

TryGetValue을 사용하는 올바른 방법은 다음과 같습니다. TryGetValue을 호출하기 전에 반환 값을 기본값으로 설정할 수없고 그 값을 TryGetValue으로 반환하면 키를 찾을 수없는 경우 기본값으로 재설정됩니다. 즉, 항상 사전에 대한 잘못된 키 때문에 키가 null 경우

public static TValue GetOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> dictionary, 
    TKey key, 
    TValue defaultValue) 
{ 
    TValue value; 
    if(key == null || !dictionary.TryGetValue(key, out value)) 
     return defaultValue; 
    return value; 
} 

은 물론 당신은 예외를 원하는 실제로 수 있습니다.

1

TryGetValue는 찾고있는 방법이 아닙니다. 이 메소드는 부울 값을 리턴합니다. 키를 찾으면 참이고 키가 없으면 거짓입니다. 키가 발견되면 선택한 값으로 값을 설정합니다. 원하는 메서드는 Dictonary 클래스에 존재하지 않습니다.

  1. 확인이있는 경우 여부 :이 blog에 도시 된 바와 같이

    var value; 
    if (somedic.TryGetValue("key", out value)) 
        lookupValue = value; 
    else 
        lookupValue = defaultValue; 
    
  2. 자신의 방법을 만들기 그래서 당신은 문제를 해결하기 위해 두 가지 옵션이 있습니다.

+0

키가 null 일 때 예외를 throw하지 않는 한, 키 유형을 null이 아닌 구조체로 설정하지 않은 한 키가 null이 아닌지 확인해야합니다. – juharr

+0

네, 맞아요. 따라서 블로그에 표시된대로 구현하는 것이 가장 좋습니다. – alejoaldana

+0

블로그는 null 키도 테스트하지 않습니다. 이 메서드는 null 키에 대한 예외를 throw 할 수 있지만 올바른 동작 과정이 아닐 수도 있지만 키가 null 인 경우 OP에서 기본값을 원할 것으로 보인다. – juharr

1

LINQ의 SingleOrDefault()가 트릭을 수행합니다.

string s = "I can't believe how ugly this is!"; 
Dictionary<char, int> histogram = new Dictionary<char, int>(); 
foreach (char c in s) 
{ 
    histogram[c] = histogram.Where(x => x.Key == c).SingleOrDefault().Value + 1; 
} 

정말 간결하거나 읽을 수 있지만 실제로는 한 줄짜리입니다.

효율성면에서이 컴파일 결과에 대해 확신하지 못합니다.

물론 LINQ 경로를 시작한 후에는 작업중인 모든 문제를 해결할 수있는 대체 방법에 대해 생각해 볼 수 있습니다.

관련 문제