2015-09-27 115 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你走了。查看更新后的答案。 –