2016-03-23 21 views
-2

Bu kodu var:Neden uyumsuzluk devam etmeden önce iki kez ortaya çıkıyor?

int RVHHSelectionIndex = 0; 
int RVSelectionIndex = 0; 
while (RVMismatch()) 
{ 
    studentFullname = checkListBoxRV.Text; 
    assistantFullname = checkListBoxRVHH.Text; 
    listBoxMessages.Items.Add(string.Format(mismatchDiscovered, studentFullname, assistantFullname)); 
    if (RVHHSelectionIndex < RVHHCount - 2) 
    { 
     checkListBoxRVHH.SelectedIndex = RVHHSelectionIndex++; 
     checkListBoxRVHH.SetItemChecked(checkListBoxRVHH.SelectedIndex, true); 
    } 
    else 
    { 
     // If all the HHs have been gone through, start again at the beginning: 
     checkListBoxRVHH.SelectedIndex = 0; 
     checkListBoxRVHH.SetItemChecked(checkListBoxRVHH.SelectedIndex, true); 
     // ...and move to the next Student: 
     if (RVSelectionIndex < checkListBoxRV.Items.Count - 2) 
     { 
      checkListBoxRV.SelectedIndex = RVSelectionIndex++; 
      checkListBoxRV.SetItemChecked(checkListBoxRV.SelectedIndex, true); 
     } 
    } 
} 

private bool RVMismatch() 
{ 
    if (!System.IO.File.Exists(AYttFMConstsAndUtils.STUDENTS_FILENAME)) return true; 
    if (null == AYttFMConstsAndUtils.STUDENTS_FILENAME) return true; 
    int RVStudentID = Convert.ToInt32(checkListBoxRV.SelectedValue); 
    int RVHHCandidateID = Convert.ToInt32(checkListBoxRVHH.SelectedValue); 
    Student RVStudent = AYttFMConstsAndUtils.StudentsList.SingleOrDefault(i => i.StudentID.Equals(RVStudentID)); 
    Student RVHHCandidate = AYttFMConstsAndUtils.StudentsList.SingleOrDefault(i => i.StudentID.Equals(RVHHCandidateID)); 
    // If either are null, return true 
    if ((null == RVStudent) || (null == RVHHCandidate)) return true; 
    // If Student male, candidate assistant female, and not family, return true 
    if (RVStudent.IsMale) 
    { 
     if (!RVHHCandidate.IsMale && RVStudent.FamilyID != RVHHCandidate.FamilyID) return true; 
    } 
    // If Student female, candidate assistant male, and not family, return true 
    if (!RVStudent.IsMale) 
    { 
     if (RVHHCandidate.IsMale && RVStudent.FamilyID != RVHHCandidate.FamilyID) return true; 
    } 
    // Otherwise, it's good: 
    return false; 
} 

... ana öğrenci olarak atanan kişinin o kişi ile iyi bir maç olduğunda başka Householder (RVHH) seçmek gerekiyordu (bazı kurallar vardır Bu onları bir uyumsuzluk haline getirir).

Ana öğrenci (RV) diğeri asistanı (RVHH) olan iki adet combobox vardır. İlk HH bir uyumsuzluksa, açılan kutuda bir sonraki aday HH'ye hareket eder. Tüm RVHH adayları uyumsuzsa, RV combobox bir sonraki aşamaya artırılır ve bir eşleşme gerçekleşene kadar işlem tekrar başlar.

Çoğu bölüm için çalışıyor, ancak garip olan şey "günlük" girdim bazen aynı eşleşmenin iki kez bulunduğunu gösteriyor olmasıdır. Eğer bu durum her zaman olsaydı, kodumda bariz ve berbat bir kusur olduğunu anlardım. Ama her zaman gerçekleşmez. Örneğin, burada "Uyuşmazlığı" iletileri not: alt comboboxes için

enter image description here

, ilk HH aday da bir uyumsuzluk oldu uyumsuzluğu iki kez sonrakine geçmeden önce, olarak görülüyordu ama sadece bir kez giriş yaptı ve bir sonraki, aynı durumdaydı; Sonunda bir uyumsuzluk olmayan bir sonraki adayı seçti ve böylece kayıt durdu.

Niçin ilk harekete geçmeden önce iki kez geçti?

+0

Kodunuzu hata ayıklamayı denediniz mi? – Styxxy

+0

Tabii ki; Belli ki, bazen iki kez aynı yoldan geçiyor ve bir kez daha; neden olsa da, ovmak. –

+0

Herhangi biri tek tek çalışabilecek olası en küçük kod örneğini sağlamaya çalışın (ayrıca bkz. Jon Skeet blogu: http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/). Ben hata ayıklamak istiyorum, ne olduğunu görmek, ama sağlanan kodu ile, bunu yapmak zor ... – Styxxy

cevap

2

Kodunuzu çalıştıramadığımdan emin olamıyorum; ama sanırım kodunuz sadece ilk kez form gösterisinde iyi çalışıyor; Çünkü form ilk gösterildiğinde, kontrol listesi kutularının seçim indeksi her zaman -1 (seçim seti yok) olur;

studentFullname = checkListBoxRV.Text; 
assistantFullname = checkListBoxRVHH.Text; 
listBoxMessages.Items.Add(string.Format(mismatchDiscovered, studentFullname, assistantFullname)); 

Ama kod yeniden çalıştırıldığında, seçim endeksi görünüyor, çünkü bu hattın 0 değiştirdik için: bu yüzden bu blokla hiçbir sorun olacaktır

checkListBoxRVHH.SelectedIndex = 0; 

Yani listBoxMessages should

if (RVHHSelectionIndex < RVHHCount - 2) 
{ 
//... 

Bir kez daha ilk öğeyi okuyun, tekrar normal kod yürütme sırası ile.

İlgili konular