正在将项添加到列表字符串[]
本文关键字:列表 字符串 添加 | 更新日期: 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.functionTitle
是null
,因为数组是引用类型,并且您没有在任何位置初始化属性(因此它具有默认值:引用类型的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