2013-09-01 47 views
-1

我在刪除功能時遇到問題。除了刪除功能,我已經可以工作了。刪除某個類別的功能

任何幫助,將不勝感激。我試圖改變它,但它仍然不會刪除。我不知道我的刪除功能有什麼問題。

public class Person 
{ 
    private string name; 
    private string phoneNumber; 

    public string Name 
    { 
     set { name = value; } 
     get { return name; } 
    } 
    public string PhoneNumber 
    { 
     set { phoneNumber = value; } 
     get { return phoneNumber; } 
    } 
    public void PrintInfo() 
    { 
     Console.WriteLine(); 
     Console.WriteLine(" Name: {0}", name); 
     Console.WriteLine(" Phone Number: {0}", phoneNumber); 
     Console.WriteLine(); 
    } 
    public void SaveASCII(ref StreamWriter output) 
    { 

     output.WriteLine(name); 
     output.WriteLine(phoneNumber); 

    } 
    public void LoadASCII(ref StreamReader input) 
    { 

     name = input.ReadLine(); 
     phoneNumber = input.ReadLine(); 

    } 

} 


public class membershipList 
{ 

    public Person[] ML = null; 

    public void AddMember(Person p) 
    { 
     if (ML == null) 
     { 
      ML = new Person[1]; 
      ML[0] = p; 
     } 
     else 
     { 
      Person[] temp = ML; 
      ML = new Person[temp.Length + 1]; 
      for (int i = 0; i < temp.Length; ++i) 
      { 
       ML[i] = new Person(); 
       ML[i] = temp[i]; 
      } 
      ML[temp.Length] = new Person(); 
      ML[temp.Length] = p; 
      temp = null; 

     } 
    } 
    public void DeleteMember(string p) 
    { 

     if (ML != null) 
     { 
      foreach (Person pers in ML) 
      { 
       if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0) 
       { 
        pers.Remove(); 
        break; 

       } 
      } 
     } 

     else Console.WriteLine("Then list is empty."); 
    } 


       // { 
       //  int memberIndex = Array.FindIndex(ML, p => p.Name == name); 
       //  if (memberIndex == -1) 
       // { 
       //  Console.WriteLine(name + " had not been added before."); 
       //  return; 
       // } 
       // else 
       // { 
       // List<Person> tmp = new List<Person>(ML); 
       //  tmp.RemoveAt(memberIndex); 
       //  ML = tmp.ToArray(); 
       // } 
     // } 
    // } 


    public void PrintAll() 
    { 
     if (ML != null) 
      foreach (Person pers in ML) 
       pers.PrintInfo(); 
     else Console.WriteLine("Then list is empty"); 
    } 
    public void Search(string p) 
    { 
     if (ML != null) 
     { 
      foreach (Person pers in ML) 
      { 
       if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0) 
       { 
        Console.WriteLine("1 Record Found:"); 
        pers.PrintInfo(); 
        break; 
       } 
      } 
     } 

     else Console.WriteLine("Then list is empty."); 
    } 

    public void ReadASCIIFile() 
    { 
     StreamReader input = new StreamReader("memberlist.dat"); ; 

     try 
     { 

      int num = Convert.ToInt32(input.ReadLine()); 
      ML = new Person[num]; 

      for (int i = 0; i < num; ++i) 
      { 
       ML[i] = new Person(); 
       ML[i].LoadASCII(ref input); 

      } 
      input.Close(); 
     } 
     catch (FormatException e) 
     { 
      Console.WriteLine(e.Message); 
      input.Close(); 
     } 


    } 

    public void SaveASCIIFile() 
    { 

     StreamWriter output = new StreamWriter("memberlist.dat"); 

     output.WriteLine(ML.Length); 
     foreach (Person pers in ML) 
     { 
      pers.SaveASCII(ref output); 

     } 
     output.Close(); 


    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 

     membershipList ML = new membershipList(); 
     ML.ReadASCIIFile(); 

     string option; 
     do 
     { 

      // Console.Clear(); 
      Console.WriteLine(); 
      Console.WriteLine(); 
      Console.WriteLine("MemberShip List MENU"); 
      Console.WriteLine(); 
      Console.WriteLine("  a. Add"); 
      Console.WriteLine("  b. Seach"); 
      Console.WriteLine("  c. Delete"); 
      Console.WriteLine("  d. Print All"); 
      Console.WriteLine("  e. Exit"); 
      Console.WriteLine(); 
      Console.Write("option: "); 
      option = Console.ReadLine().ToLower(); 

      switch (option) 
      { 
       case "a": 
        Person np = new Person(); 
        Console.Write("Enter Name: "); 
        np.Name = Console.ReadLine(); 
        Console.Write("Enter PhoneNumber: "); 
        np.PhoneNumber = Console.ReadLine(); 
        ML.AddMember(np); 
        break; 
       case "b": 
        Console.Write("Enter Name: "); 
        string name = Console.ReadLine(); 
        ML.Search(name); 
        break; 
       case "c": 
        Console.Write("Enter Name to be Deleted:"); 
        string pers = Console.ReadLine(); 
        ML.DeleteMember(pers); 
        break; 
       case "d": 
        ML.PrintAll(); 

        break; 
       case "e": 
        ML.SaveASCIIFile(); 
        Console.WriteLine("BYE...... "); 
        break; 

       default: 
        Console.WriteLine("Invalid Option"); 
        break; 
      } 


     } while (option.ToLower() != "d"); 
    } 
} 
+3

你的問題確實含糊不清。你能澄清一下嗎? – sircodesalot

+7

你似乎有'pers.Remove();'但是這可能不應該編譯(因爲你的'Person'類似乎沒有'Remove()'方法)。想一想 - 你想從*移除人*的是什麼? –

+0

請避免提問,因爲你懶得做自己的調試。 –

回答

0

我看到兩件事情:

  1. 如果你要添加和刪除列表中的項目,使用List<Person>而不是數組。現在您需要將數組複製到臨時列表中,刪除該項目,然後將其複製回數組。
  2. Delete功能則只是:

    if (ML != null) 
    { 
        Person pers = ML.FirstOrDefault(x => x.Name.ToLower() == p.ToLower()); 
        if(pers != null) 
        { 
          ML.Remove(pers); 
          break; 
        } 
    } 
    
0

你的問題是這樣的:

foreach (Person pers in ML) 
{ 
    if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0) 
    { 
     pers.Remove(); 
     break; 
    } 
} 

您從您是通過遍歷collection中移除,並且拋出了迭代器的循環。

要麼向後循環收集,所以刪除不會退出循環的迭代器。

創建第二個列表,其中包含要保留的值。所以你本質上會做相反的事情;而不是刪除你將不會添加到保留列表。

+0

原來,即使我們使用VS2012,我們仍然必須瞭解有關編程的內容(當然,目前公司目前沒有違法行爲) –

0

您正在循環訪問一個數組,然後調用remove方法。關於每個循環的一點是,它使用的迭代器在每個循環中都無法修改。但即使可以,它也不是那麼簡單,因爲你不能簡單地從數組中移除。你可以從一個通用的列表或一個ListArray,但不是從一個數組。要遵循您已經遵循的相同模式(假設您需要使用數組並重新調整它們的大小),您需要創建一個臨時數組,並將ML數組中的所有元素複製到新數組中,然後刪除已刪除的成員。

檢查我的語法,因爲我沒有測試這段代碼,但你應該明白了。

public void DeleteMember(string p) 
    { 

     if (ML != null) 
     { 
      Person[] tempList = new Person[ML.Length - 1]; 
      bool deletedAPerson = false; 
      int i = 0; 
      foreach (Person pers in ML) 
      { 

       if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0) 
       { 
        deletedAPerson = true; 
        continue; //skip over this person and do not copy over to the new Array 
       } 

       if(i < pers.Length) //if no person was found, prevent index out of bounds exception 
        tempList[i++] = pers; 
      } 
      if(deletedAPerson) 
       ML = tempList; 
     } 

     else Console.WriteLine("Then list is empty."); 
    }