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

本文关键字:列表 字符串 添加 | 更新日期: 2023-09-27 18:01:04

我正试图使用以下结构将从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();

有人看到我做错了什么吗?

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

item.functionTitlenull,因为数组是引用类型,并且您没有在任何位置初始化属性(因此它具有默认值:引用类型的null(。

即使这不是问题(假设functionTitle是一个空数组(,item.functionTitle[i]也会再次抛出,因为它试图访问越界的索引。最后,您有一个off-by-one错误:数组中的第一个元素的索引是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);
}

您的数组未初始化,因此为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());

我把结构改成了类,因为它是可变的,而可变结构是邪恶的。

首先初始化数组。

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