将项添加到列表字符串[]

时间:2013-02-25 12:11:41

标签: c# list struct

我正在尝试使用此结构将我从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);
    }
}

但是我在这一行得到了一个空引用:

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

谁能看到我做错了什么?

3 个答案:

答案 0 :(得分: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 :(得分:1)

首先初始化数组。

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

答案 2 :(得分: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