2009-09-21 1 views
1

안녕하세요 여러분, 사전에 추가하려고하는데 "개체 참조가 인스턴스로 설정되지 않았습니다."라는 메시지가 나타납니다. 객체." 오류. 내가 생각하기에 내가 설정하려고하는 것은 존재하지 않는다는 의미인가?csharp 사전 정의에 추가 할 수없는 "개체 참조가 인스턴스로 설정되지 않았습니다 ..."

   Dictionary<string, Dictionary<int, Dictionary<string, string>>> user = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>(); 
      user.Add("approved", null); 
      user.Add("pending", null); 
      user.Add("declined", null); 
      int zz = 0; 

      while (results.Read()) 
      { 
       Dictionary<string, string> field = new Dictionary<string, string>(); 
       for (int i = 0; i < results.FieldCount; i++) 
       { 
        switch (fds[i].ToString()) 
        { 
         case "gender": 
          string gend = ((Convert.ToBoolean(results[i])) == false) ? "Male" : "Female"; 
          field.Add("gender", gend); 
          break; 
         default: 
          field.Add(fds[i], results[i].ToString()); 
          break; 
        } 
       } 
       string status = results[0].ToString(); 
       user["approved"].Add(zz, field); 
       zz++; 
      } 

내가 처음에 세 개의 사전을 설정하고있는 방식에 문제가 있습니다 :

이 관련 코드는?

+0

는 현재 부가 기능은 실패? 여러 번 추가했습니다 – blowdart

답변

5

싸이 덕분에, 당신은 당신의 중첩 된 사전 구조에서 세 번째 수준을 가지고, 당신은 두 번째 수준의 초기화를 건너 뛰는 것입니다. 개인적으로

user.Add("approved", new Dictionary<int, Dictionary<string, string>>()); 
user.Add("pending", new Dictionary<int, Dictionary<string, string>>()); 
user.Add("declined", new Dictionary<int, Dictionary<string, string>>()); 

, 나는에 user에 대한 사전을 사용하지 것이다 : 아마 더 좋을 것이다 무엇 앞까지 더 초기화를 할

user["approved"] = new Dictionary<int, Dictionary<string, string>>(); 

입니다

: 적어도, 당신은 추가해야 모든. 즉, 요청의 상태가 다양 할 수 있다는 것을 의미하며, 실제로 보류, 승인, 거절 등의 가능성이 있습니다. 제 의견으로는, 당신은 3 개의 콜렉션을 가지고있는 클래스를 작성하는 것이 낫습니다.

이렇게하면 중첩 된 사전이 3 개 없으므로 코드를보다 쉽게 ​​읽을 수 있습니다. 코드를 유지 관리하는 사람은 물론 혼란스러워 할 정도로 충분했습니다.

+0

내가 잊어 버린 단계가 있음을 알았습니다! 감사! 나는 사전을 사용하고 있는데 그 이유는 내가 다시 결과를 통해 루프 필요하다 이 나는 ​​그들이 제대로 자신의 상태에 의해 분류되어 있는지 확인하는 데 사용하는 단지 방법입니다. – Psytronic

+0

... 승인 됨/대기 중/거부됨을 포함하는 열거 형을 정의하거나 ... –

1

user은 사전에 string을 매핑하는 사전입니다 (자세한 내용은 Google의 목적에 중요하지 않음). 라인

user.Add("approved", null); 

null 사전에 user 매핑 "approved"에 항목을 추가합니다. 당신은 당신이 null 사전에 방법 Dictionary.Add를 호출하려는 당신이 라인을

user["approved"].Add(zz, field); 

을 쳤을 때 있도록 "approved"이 비 null 사전에 매핑되는 사전을 설정하지 않습니다. 당신은 user의 다른 두 항목에

user["approved"] = new Dictionary<int, Dictionary<string, string>>(); 

같은이 적용되는 줄을 추가하여이 문제를 해결할 수 있습니다.

2

당신은 Dictionary<int, Dictionary<string, string>> 객체를 생성하지 코드의 라인에 너무 :

user["approved"].Add(zz, field); // user["approved"] is null 
0

무엇에 대해 :

user["approved"] = field; 

행하십시오 NullReferenceException 때문에와

user["approved"].Add(zz, field); 

앞머리 user["approved"]에 액세스하면 init이 아니기 때문에 null을 반환합니다. 초기화.어떤 라인에서

관련 문제