2010-01-18 3 views
8

일반 사전 개체가 비어 있는지 테스트하려면 어떻게해야합니까? 나는 다음과 같이 몇 가지 코드를 실행하려면 : 이 코드를 실행 한 후 reportGraphs 사전이 비어와 MoveNext는()가 즉시 NullReferenceException이를 던졌습니다 System.Collections.Generic.Dictionary빈 generic.dictionary 컬렉션을 테스트하는 방법은 무엇입니까?

while (reportGraphs.MoveNext()) 
{ 
    reportGraph = (ReportGraph)reportGraphs.Current.Value; 
    report.ContainsGraphs = true; 
    break; 
} 

reportGraph 객체 타입이다. 빈 콜렉션을보다 효율적으로 처리하는 방법이 있다면 블록 주위에 try-catch를 넣고 싶지는 않습니다.

감사합니다.

+2

'reportGraphs' 자체가'null'이 아닌가요? – dtb

+2

'System.Collections.Generic.Dictionary'은'MoveNext()'메소드를 가지고 있지 않습니다. 당신은 사전에 대한 반복자를 생각하고 있지 않습니까? –

+0

대단히 죄송합니다. reportGraphs는 실제로 에서와 같이 .Enumerator로 정의됩니다. reportGraphs = new System.Collections.Generic.Dictionary .Enumerator(); 그래서 MoveNext()를 감지하는 방법은 열거 자에 적용 할 때 예외를 throw합니다. null을 확인하려고하면 연산자 '! ='를 'System.Collections.Generic.Dictionary .Enumerator'및 ' – DEH

답변

12

일반적인 사전의 경우 Dictionary.Count을 확인할 수 있습니다. 빈 경우 Count가 0이됩니다.

그러나 귀하의 경우 reportGraphsIEnumerator<T> 인 것 같습니다. 수동으로 컬렉션을 열거하는 이유가 있습니까?

+0

당신은 맞습니다 - 실제로 열거 자입니다 - 미안 해요. 애플 리케이션 내의 객체 모델이 구조화 된 바로 그 이유는 틀림 없다. 꽤 많은 일이 필요할 것이다. – DEH

+1

IEnumerator를 직접 사용하지 않는 것이 훨씬 좋다. foreach 루프를 대신 사용한다. , 일반적으로이 정확한 시나리오를 막을 것이므로 ... –

6

empty 사전과 null의 차이점이 있습니다. 빈 모음에 MoveNext을 호출해도 NullReferenceException이되지는 않습니다. 나는 당신의 경우에 당신이 reportGraphs != null인지 테스트 할 수 있다고 생각합니다.

+0

reportGraphs 형식의 피연산자에 적용 할 수 없습니다. 사전보다 열거 자. 왜 사전은'null' 열거자를 반환해야합니까? 그냥 궁금해서 ... – dtb

+0

@dtb 좋은 지적. IEnumerable 이어야합니다. –

+0

그러나'Dictionary '는'IEnumerable >을 구현하고 있지 않습니까? 나는 이것이 'Value'속성이 어디에서 비롯되는지 믿습니다. – Groo

3

Darin이 말한 것처럼 NullReferenceException을 던지면 reportGraphsnull입니다. 가장 좋은 방법은 null이 아닌지 확인하는 것입니다 (즉, 클래스의 생성자에서 초기화되었는지 확인).

또 다른 방법

는 (명시 적으로 열거 피하기 위해)를 foreach 문을 사용하는 것이 작업을 수행합니다 :

foreach (KeyValuePair<Key,Value> item in reportGraphs) 
{ 
    // do something 
} 

[편집] 참고이 예제는 reportGraphs 결코 null 없다는 것을 가정 것이다.

+0

reportGraphs가 null 인 경우 NullReferenceException을 throw합니다. –

+0

올바른지, * 가장 좋은 방법은 결코 null이 아니란 것을 확인하는 것입니다 *. – Groo