2014-02-08 4 views
0

나는 학생의 학년을 계산하고 그 학생이 명예 학생인지 확인하는 프로그램을 만들고 있습니다. 문제는 1 등 학생들을위한 목록 만 추가된다는 것입니다. 둘째와 셋째에 속하는 나머지는 더 이상 표시되지 않습니다. 나는 거의 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 인 총 g 수와 동일한 경우 학생 ID를 확인하십시오. 두 번째 명예 학생을위한

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 }); 
    } 
} 
} 

에 대한

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 }); 
} 
} 

최초의 명예 학생을위한

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); 
    } 
    } 

세 번째 명예 학생

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 }); 
    } 
} 
} 

답변

0

귀하의 문제는 그 foreach는 루프 내부 너는 나다. terating 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); 
    } 
} 

어쨌든 나는이 코드가 간신히 읽고 유지 보수 가능하기 때문에 리팩터링을 제안합니다. 비슷한 코드에 대한 메서드를 추출하려면 .Count> = 1 대신 linq의 .Any()를 사용하고 .Add를 반복 및 사용하는 대신 .AddRange를 사용하십시오.

실제로 두 번째와 같은 위치에서 같은 실수를하고 있습니다. 명예의 부분은이다 :

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 }); 
    } 
} 
} 

3 일에 같은 일이 ... 두 번째는해야 할 때 첫 번째 목록을 참조하는 경우 만주의 깊게 살펴 언급했다.

+0

지적 해 주셔서 감사합니다. 나는 내가 원했던만큼 코드를 변경하고 싶지만 시간이 없어. 이 프로그램을 오류없이 실행해야합니다. foreach 루프에서 값을 변경했지만 여전히 동일한 대답을 얻을 수 있습니다. 조금 더 도와주세요. –

+0

편집 해주세요. 시도해보십시오. –

+0

실제로 idr1의 id 목록을 참조하고있었습니다. 나는 그것들을 필터하는데 사용했다. ird2에있는 id가 idr1에 존재한다면 나는 그것을 추가하지 않아도됩니다. 같은 세 번째 명예에 대 한 간다 –

관련 문제