2013-02-25 3 views
1

나는이 구조체 사용하여 내 목록에 DataTable의에서 내가 가진 몇 행을 추가하려고 :목록에 항목을 추가 문자열 []

protected struct roleProperties 
{ 
    public string roleName { get; set; } 
    public string[] functionTitle { get; set; } 
} 

당신은 내가 방법 Title 내부 이상의 문자열을 원하는 볼 수 있듯이을

public void getRoleFuncs(int roleId) 
{ 
    List<roleProperties> roles = new List<roleProperties>(); 
    int i = 1; 

    SqlParameter ro_id = new SqlParameter("@ro_id", roleId); 
    string q = "SELECT ro_name, fu_title FROM roles INNER JOIN rolefunctions ON roles.ro_id = rolefunctions.fk_role_id INNER JOIN functions ON rolefunctions.fk_func_id = functions.fu_id WHERE ro_id = @ro_id"; 
    SqlDataReader r = gm.returnReader(q, ro_id); 
    while (r.Read()) 
    { 
     roleProperties item = new roleProperties(); 
     item.roleName = r["ro_name"].ToString(); 
     foreach (IDataRecord str in r) 
     { 
      item.functionTitle[i] = r["fu_title"].ToString(); 
      i++; 
     } 
     roles.Add(item); 
    } 
} 

그러나 나는이 라인에 null 참조 얻을 : 문자열

나는 이런 식으로 일을하려고 한

item.functionTitle[i] = r["fu_title"].ToString(); 

내가 뭘 잘못하고 있는지 알 수 있습니까?

답변

1

귀하의 배열이 초기화되고, 따라서 널 (null) 당신은 당신이 그것을 필요로하려고하는 배열의 크기를 알 수 없기 때문에 목록

에 대신

변화에게 당신의 구조체를 사용하는 것이 더 적절한 접근 방식을 보인다되지 않는다

protected class roleProperties 
{ 
    public string roleName { get; set; } 
    public IList<string> functionTitle { get; private set;} 
    public roleProperties(){ 
     functionTitle = new List<string>(); 
    } 
} 

하고

item.functionTitle[i] = r["fu_title"].ToString(); 

을 변경
item.functionTitle.Add(r["fu_title"].ToString()); 

변경 가능하고 mutable structs are evil이므로 struct를 클래스로 변경했습니다.

+0

고마워요, 구조체의 목록으로 시도했지만 작동하도록 가져올 수 없습니다, 당신의 예제를 찾고, 다시 감사합니다. – mackwerk

3

item.functionTitlenull 배열이 참조 형식이기 때문에 그리고 당신은 어디 속성을 초기화하지 않은 (그래서 기본값이 있습니다 참조 유형에 대한 null).

비록 이것이 문제가되지 않더라도 (functionTitle이 빈 배열이라고 가정 해 봅시다) item.functionTitle[i]은 범위를 벗어난 색인에 액세스하려고하기 때문에 다시 던졌습니다. 그리고 마지막으로 배열에있는 첫 번째 요소의 색인이 0이고 1이 아니라 오프 바이 한 오류가 있습니다.

는 먼저 배열을 초기화

while (r.Read()) 
{ 
    roleProperties item = new roleProperties(); 
    item.roleName = r["ro_name"].ToString(); 
    item.functionTitle = r.Select(o => o["fu_title"].ToString()).ToArray(); 
    roles.Add(item); 
} 
1

에 코드를 변경하여 위의 모든 문제를 해결할 수 있습니다.

item.functionTitle = new string[n]; // where n is an int 
+0

리더기에서 '카운트'를 사용할 수 없습니다. 알고 계십니까? 시도해도 IDE에서 오류가 발생합니다. – mackwerk

관련 문제