2015-09-27 82 views
0

類管理:爲什麼我的清單是空的?

namespace AnimalShelter 
{ 
    class Administration 
    { 
    private List<Animal> animalList; 

    public Administration() 
    { 
     animalList = new List<Animal>(); 
    } 

    public bool AddAnimal(Animal animal) 
    { 
     bool status = false; 
     foreach (Animal TempAnimal in animalList) 
     { 
      if (TempAnimal.ChipRegistrationNumber == animal.ChipRegistrationNumber) 
      { 
       status = false; 
      } 
      else 
      { 
       status = true; 
       animalList.Add(animal); 
      } 
     } 
     return status; 
    } 

正如你所看到的,我做了一個列表,在constuctor對其進行初始化。

在AddAnimal方法中,如果數字與其他數字相同,則循環訪問列表。如果數字匹配,則不能使用該特定ChipNumber添加其他動物。

現在我的表格:

private Administration administration; 

public AdministrationForm() 
{ 
    administration = new Administration(); 
} 

private void btnCreateAnimal_Click(object sender, EventArgs e) 
{ 
      Animal cat1 = new Cat(params..); 
      if (administration.AddAnimal(cat1)) 
      { 
       MessageBox.Show("Following animal has succesfully been 
       added: " + Environment.NewLine + cat1.ToString()); 
      } 
      else 
      { 
       MessageBox.Show("Animal with this chipnumber already exists. 
       Please Choose another one."); 
      } 
} 

所以在這裏,我只是陳述輕鬆如果方法正確,創造了動物。如果它是假的,不要添加動物。

問題:如果我將動物添加到列表中,列表始終爲空。就好像它不斷地刷新/清除列表。我在這裏做錯了什麼?

希望這可以理解,否則讓我知道!

+0

爲什麼你在AddAnimal方法中有foreach循環? – Viru

+0

@Viru我使用它,因爲我必須檢查列表中的每個動物,如果芯片編號具有相同的芯片編號以填寫註冊。希望是有道理的 – Levialhan

+1

當你新增了'Administration'時,'animalList'的長度爲0.每次你嘗試添加到這個時,你循環遍歷這個列表(0次)。你永遠不會去實際添加動物的部分,因爲它內部的循環被擊中0次 – Tom

回答

1

您需要將添加mthod外foreach循環

public bool AddAnimal(Animal animal) 
    { 
     bool status = false; 
     foreach (Animal TempAnimal in animalList) 
     { 
      if (TempAnimal.ChipRegistrationNumber == animal.ChipRegistrationNumber) 
      { 
       status = false; 
      } 
      else 
      { 
       status = true; 

      } 
     } 
    if(status) 
animalList.Add(animal); 
     return status; 
    } 
+1

哦,我的上帝啊,這是一個基本的錯誤。我不敢相信我爲此而墮落。我正要將我的頭撞在牆上..非常感謝! – Levialhan

+0

但是,你不強制規則_你不能添加另一個動物的具體ChipNumber_ –

+0

@ user2966741它可能發生在任何人:) – Viru

1

因爲您創建後列表爲空,當您添加第一個動物時foreach從不執行,因爲列表中沒有任何內容。替換:

public bool AddAnimal(Animal animal) 
{ 
    bool status = true; 
    foreach (Animal TempAnimal in animalList) 
    { 
     if (TempAnimal.ChipRegistrationNumber == animal.ChipRegistrationNumber) 
     { 
      status = false; 
     } 
     else 
     { 
      status = true; 
     } 
    } 
    if (status) 
    { 
     animalList.Add(animal); 
    } 
    return status; 
} 

使用LINQ,我們可以把它縮短:

public bool AddAnimal(Animal animal) 
{ 
    if (!animalList.Any(a => a.ChipRegistrationNumber == animal.ChipRegistrationNumber)) 
    { 
     animalList.Add(animal); 
     return true; 
    } 
    return false; 
} 
+0

這不會工作仍然 –

+0

@EhsanSajjad爲什麼? – Backs

+0

'第一塊中的if(status)'看起來對我來說不正確,試一試,你自己說當列表中的空foreach不會執行,所以''bool''變量總是假的 –

1

你不需要status可言。簡單更好。

public bool AddAnimal(Animal animal) 
{ 
    foreach (Animal TempAnimal in animalList) 
     if (TempAnimal.ChipRegistrationNumber == animal.ChipRegistrationNumber) return false; 
    animalList.Add(animal); 
    return true; 
} 

這是有2種方法的等效:

public bool IsDuplicate(Animal animal) 
{ 
    foreach (Animal TempAnimal in animalList) 
     if (TempAnimal.ChipRegistrationNumber == animal.ChipRegistrationNumber) return true; 
    return false; 
} 
public bool AddAnimal(Animal animal) 
{ 
    if (IsDuplicate(animal)) return false; 
    animalList.Add(animal); 
    return true; 
} 

Add返回true,如果該項目已被添加,假當存在重複,因此該項目還沒有被添加

+0

我沒有在這裏得到的部分是,如果你使用「if」語句,如果它是真的,你將返回「false」。 然後你添加動物,但你仍然返回「真實」。 – Levialhan

+0

我檢查了代碼,它確實有效。但你能否澄清一下? – Levialhan

+0

@ user2966741你走了。查看更新後的答案。 –