我创建一个问题池,从那里选择随机问题以应用某种算法,无论如何,当我调试程序时,得到的索引都超出了数组错误的范围。
对我在说什么有一个清晰的想法,这是我要问的问题:
首先我定义类Gene代表问题
public class Gene
{
public string question { get; set; }
public string CLO { get; set; }
public string type { get; set; }
public string Answer { get; set; }
public string mark { get; set; }
public string chapter { get; set; }
public Gene(string s, string t, string i, string a, string m, string c)
{
this.question = s;
this.type = t;
this.CLO = i;
this.Answer = a;
this.mark = m;
this.chapter = c;
}
}
List<Gene> QuestionList = new List<Gene>();
然后我从数据库提出问题
protected void DropDownList5_SelectedIndexChanged(object sender, EventArgs e)
{
string sub = DropDownList5.Text;
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Sondos\Downloads\For the project\suz\ExamGenerationSystem.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
string s = "select * FROM QuestionBank WHERE (Cource_Code = '" + DropDownList5.SelectedItem.Text + "') ORDER BY RAND()";
SqlCommand cmd = new SqlCommand(s, con);
SqlDataReader dr;
con.Open();
dr = cmd.ExecuteReader();
dr.Read();
while (dr.Read())
{
string ques = dr["Question"].ToString();
string questype = dr["Question_Type"].ToString();
string quesCLO = dr["CLO"].ToString();
string quesAnswer = dr["Answer"].ToString();
string quesMark = dr["Mark"].ToString();
string quesChapter = dr["Chapter"].ToString();
QuestionList.Add(new Gene(ques, questype, quesCLO, quesAnswer, quesMark, quesChapter));
}
}
然后我问问题池
Gene[] QuestionPool { get { return QuestionList.ToArray(); } }
当我尝试使用此方法随机选择问题时:
private System.Random randome;
private Gene GetRandomQuestion()
{
int i = randome.Next(QuestionPool.Length);
return QuestionPool[i];
}
错误索引超出数组范围
return QuestionPool[i];
最佳答案
int i = randome.Next(QuestionPool.Length);
在此,如果QuestionPool
为空,则该内容将变为int i = randome.Next(0)
,并返回零。
因此,
返回QuestionPool [i]; //我变成0
由于QuestionPool为空且索引0没有任何内容,将抛出Index was outside the bounds
。
因此,请确保QuestionPool不为空。
在某些情况下会导致QuestionPool
为空。
数据库中没有Cource_Code = DropDownList5.SelectedItem.Text
记录
在这种情况下,第一次迭代时while (dr.Read())
将是false
,并且Gene
不会添加任何QuestionList
。
在将任何GetRandomQuestion
添加到Gene
之前,将调用QuestionList
避免SQL注入
该行易受SQL注入攻击
(Cource_Code ='“ + DropDownList5.SelectedItem.Text +”')
这意味着如果用户将SelectedItem的Text更改为类似
a'); Drop table QuestionBank; -- //Anything after -- becomes a comment
然后查询将变为
select * FROM QuestionBank WHERE (Cource_Code = 'a'); Drop table QuestionBank;
和您的表将被删除。
为避免这种情况,请参考此answer。
列为阵列
如果有列表,则还可以按索引访问其项目。要获得其长度,可以使用Count。因此,GetRandomQuestion可以成为
private Gene GetRandomQuestion()
{
int i = randome.Next(QuestionList.Count);
return QuestionList[i];
}
如果您仅将QuestionPool用于此目的,则无需使用它。