당신이 반복적으로이 작업을 수행해야한다는 것을 의미하는 경우, 그리고 길고 추한, 논리를 다른 클래스로 추상화하고 확장 메소드를 사용하십시오.
public static class DictionaryExtensions
{
public static DictionaryChecker<TKey,TValue> contains<TKey,TValue>(this IDictionary<TKey,TValue> dictionary, TValue value)
{
return new DictionaryChecker<TKey,TValue>(value, dictionary);
}
}
public class DictionaryChecker<TKey,TValue>
{
TValue value;
IDictionary<TKey,TValue> dictionary;
internal DictionaryChecker(TValue value, IDictionary<TKey, TValue> dictionary)
{
this.value = value;
this.dictionary = dictionary;
}
public bool For(TKey key)
{
TValue result;
return dictionary.TryGetValue(key, out result) && result.Equals(value);
}
}
지금 당신의 코드를 대체 :
if(!someDictionary.contains(actual).For(id)){
// id not known yet or associated value changed.
}
출처
2010-06-10 13:44:05
Jay
'out'매개 변수의 사전 선언이 필요한 경우 2 조건문과 완전히 동일하지 않습니다. "…그것에 익숙해?" devs는 "혼란 스럽다", * per se *는 아닙니다. 왼쪽에서 오른쪽으로 읽는 베테랑 프로그래머조차도이 글을 읽으려고 앞뒤로 튀어 오르며 그렇게하면서 마음 속의 몇 가지 요소를 뒤적 거리며 조종해야합니다. 이것은 어려운 일이 아니지만 자연스럽지 않습니다. 이것은 다소 절차적인 코드이며 반복 및 오류의 기회를 제공합니다. 가독성은 합법적 인 관심사이며 'bool'결과가 의미 상 약한 'TryGetValue'입니다. – Jay
@ Jay : 왜 out 변수의 선언을 확인하겠습니까? 그것은 명백하게 (또는 컴파일러가 불평 할 것입니다) 분명히 값이 무엇인지 이전에 신경 쓰지 않아야합니다 (out 파라미터이므로 값은 함수에 의해 사용되지 않습니다). 이것은 조건부 대신에 '아웃'에 관한 것입니까? 이 진술서에서 인정할 수있는 유일한 점은 1.) 부작용이 조건부에 있고, 2.) 조건부가 순서에 의존한다는 것입니다. 'bool Try * (out)'은 BCL의 잘 짜여진 관용구로 devm이 grok을 기대하기 때문에 첫 번째 것을 용서합니다. –
@ 제이 : 귀하의 의견은 "spot-on"입니다. 필자의 의견으로는 답을 읽는 것이 가독성을 언급하지 못합니다. 이것이 내가 제안한 코드를 구성한 이유입니다. – AMissico