添加项目到列表视图和过滤现有项目
问题描述:
我正在制作一个计算学生成绩的程序,看看学生是否是一名荣誉学生。问题是只添加了第一名荣誉学生的名单。属于第二和第三的其他人不再显示。我一直试图弄清楚这个问题已经有将近2天了,我仍然无法找到解决这个问题的方法。添加项目到列表视图和过滤现有项目
List<int> clsid = new List<int>(){2,3,5};
int g = clsid.Count();
List<int> temp_rank1 = new List<int>();
List<int> temp_rank2 = new List<int>();
List<int> temp_rank3 = new List<int>();
//get the student id
foreach (int fr in clsid)
{
conek.OPEN("select stud_id from class_info where class_id = '"+fr+"' and tmp_gr1 >= 88");
while (conek.reader.Read())
{
temp_rank1.Add(conek.reader.GetInt32(0));
}
conek.CLOSE();
conek.OPEN("select stud_id from class_info where class_id = '" + fr + "' and tmp_gr1 >=85");
while (conek.reader.Read())
{
temp_rank2.Add(conek.reader.GetInt32(0));
}
conek.CLOSE();
conek.OPEN("select stud_id from class_info where class_id = '" + fr + "' and tmp_gr1 >= 83 ");
while (conek.reader.Read())
{
temp_rank3.Add(conek.reader.GetInt32(0));
}
conek.CLOSE();
}
如果同一个student_id的总数等于g的主题总数,则获取学生ID。
var tmp1 = temp_rank1.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp1.Count() >= 1)
{
foreach (var gh in tmp1)
{
rank1.Add(gh);
}
}
var tmp2 = temp_rank2.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp2.Count() >= 1)
{
foreach (var gh in tmp2)
{
rank2.Add(gh);
}
}
var tmp3 = temp_rank3.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp3.Count() >= 1)
{
foreach (var gh in tmp3)
{
rank3.Add(gh);
}
}
第一个荣誉学生
nye.SubItems.Add("First Honor");
listView1.Items.Add(nye);
int yt = 0;
foreach (int fgd in idr1)
{
if(rcs1[yt] >= 90){
ListViewItem gtb = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id = '"+fgd+"' ");
while (conek.reader.Read())
{
gtb.SubItems.Add(conek.reader.GetString(0));
}
conek.CLOSE();
foreach (int gfad in clsid)
{
conek.OPEN("select tmp_gr1 from class_info where class_info.stud_id = '" + fgd + "' and class_id = '" + gfad + "' ");
while (conek.reader.Read())
{
gtb.SubItems.Add(Math.Round(conek.reader.GetDouble(0),2).ToString());
}
conek.CLOSE();
}
gtb.SubItems.Add(Math.Round(rcs1[yt],2).ToString());
yt++;
listView1.Items.AddRange(new ListViewItem[] { gtb });
}
}
第二个荣誉学生
listView1.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
{
if(!idr1.Contains(fed))
{
if (rcs2[yet] >= 88)
{
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
{
gtbs.SubItems.Add(conek.reader.GetString(0));
}
conek.CLOSE();
foreach (int gfa in clsid)
{
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
{
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
}
conek.CLOSE();
}
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView1.Items.AddRange(new ListViewItem[] { gtbs });
}
}
}
第三荣誉学生
listView1.Items.Add("");
ListViewItem ne = new ListViewItem();
ne.SubItems.Add("Third Honor");
listView1.Items.Add(ne);
int yat = 0;
foreach (int fbv in idr3)
{
if (!idr2.Contains(fbv))
{
if (rcs3[yat] >= 85)
{
ListViewItem bnb = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id = '" + fbv + "' ");
while (conek.reader.Read())
{
bnb.SubItems.Add(conek.reader.GetString(0));
}
conek.CLOSE();
foreach (int nmj in clsid)
{
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fbv + "' and class_id = '" + nmj + "' ");
while (conek.reader.Read())
{
bnb.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
}
conek.CLOSE();
}
bnb.SubItems.Add(Math.Round(rcs3[yat], 2).ToString());
yat++;
listView1.Items.AddRange(new ListViewItem[] { bnb });
}
}
}
答
您的问题是内部的foreach循环你是我terate only tmp1:
var tmp1 = temp_rank1.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp1.Count() >= 1)
{
foreach (var gh in tmp1)
{
rank1.Add(gh);
}
}
var tmp2 = temp_rank2.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp2.Count() >= 1)
{
foreach (var gh in tmp1)
{
rank2.Add(gh);
}
}
var tmp3 = temp_rank3.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp3.Count() >= 1)
{
foreach (var gh in tmp1)
{
rank3.Add(gh);
}
}
无论如何,我建议你重构,因为这个代码几乎不可读和可维护。 提取类似代码的方法,使用linq的.Any()代替.Count> = 1,并使用.AddRange代替迭代和使用.Add
其实你在更多的地方做同样的错误,就像第二个荣誉的一部分,它是:
listView1.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
{
if(!idr1.Contains(fed))
{
if (rcs2[yet] >= 88)
{
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
{
gtbs.SubItems.Add(conek.reader.GetString(0));
}
conek.CLOSE();
foreach (int gfa in clsid)
{
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
{
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
}
conek.CLOSE();
}
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView1.Items.AddRange(new ListViewItem[] { gtbs });
}
}
}
当它应该是:
listView2.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
{
if(!idr2.Contains(fed))
{
if (rcs2[yet] >= 88)
{
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
{
gtbs.SubItems.Add(conek.reader.GetString(0));
}
conek.CLOSE();
foreach (int gfa in clsid)
{
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
{
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
}
conek.CLOSE();
}
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView2.Items.AddRange(new ListViewItem[] { gtbs });
}
}
}
为第三一个同样的事情......只是仔细看,你指的是第一个列表时,第二个应该是提及。
谢谢你指出。我想尽可能地更改代码,但我的时间不够了。我只需要让这个程序运行没有错误。我改变了foreach循环中的值,但仍然得到相同的答案,你可以请帮我多一点 –
编辑,请尝试。 –
我实际上是指idr1中的id列表。我用它来过滤ID。如果ird2中的id存在于idr1中,我不必添加那个。第三个荣誉 –