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

C# 将项目添加到列表字符串[],c#,list,struct,C#,List,Struct,我正在尝试使用以下结构将从DataTable中获得的几行添加到列表中: protected struct roleProperties { public string roleName { get; set; } public string[] functionTitle { get; set; } } 如您所见,我希望在方法标题字符串中包含更多字符串 我一直在尝试这样做: public void getRoleFuncs(int roleId) { List<r

我正在尝试使用以下结构将从DataTable中获得的几行添加到列表中:

protected struct roleProperties
{
    public string roleName { get; set; }
    public string[] functionTitle { get; set; }
}
如您所见,我希望在方法标题字符串中包含更多字符串

我一直在尝试这样做:

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为null,因为数组是引用类型,并且您没有在任何地方初始化属性,所以它的默认值为:引用类型为null

即使这不是问题,也可以假设functionTitle是一个空数组项。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);
}
item.functionTitle为null,因为数组是引用类型,并且您尚未在任何位置初始化属性,因此引用类型的默认值为null

即使这不是问题,也可以假设functionTitle是一个空数组项。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);
}

首先初始化数组

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

首先初始化数组

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

数组未初始化,因此为空,因为您不知道所需数组的大小。使用列表似乎更合适

将结构更改为

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


我已将结构更改为类,因为它是可变的,并且。

您的数组未初始化,因此为空,因为您不知道所需数组的大小。使用列表似乎更合适

将结构更改为

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


我已将结构更改为类,因为它是可变的,并且。

非常感谢,我在结构中使用列表进行了尝试,但无法使其工作,您的示例正是我所寻找的,再次感谢。非常感谢,我在结构中使用列表进行了尝试,但无法使其工作,您的示例正是我所寻找的,再次感谢。据我所知,你不能指望读者,对吗?如果我尝试的话,IDE会抛出一个错误。据我所知,你不能使用Count on reader,对吗?如果我尝试,IDE将抛出一个错误。