2017-08-10 101 views
2

我的名爲「list」的字典出現問題,因爲當我在添加一個人後從菜單調用方法removePeoplesaveToFile時,它不打印或保存任何內容。當我評論循環Main並創建類Person的實例,然後手動調用所有方法它的作品。我在這裏錯過了什麼?字典不存儲值

using System; 
using System.Collections.Generic; 
using System.IO; 

namespace scope_and_accessibility 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     bool menu = true; 
     while (menu) 
      { 
      menu = Menu(); 
      } 
    } 
    public static bool Menu() 
    { 
     Person person = new Person(); 
     int choice; 
     Console.WriteLine("1. Add person"); 
     Console.WriteLine("2. Delete person"); 
     Console.WriteLine("3. Save data to text file"); 
     Console.WriteLine("4. Exit"); 
     choice = int.Parse(Console.ReadLine()); 
     switch(choice) 
     { 
      case 1: 
       person.createPerson(); 
       return true; 
      case 2: 
       person.removePeople(); 
       return true; 
      case 3: 
       person.saveToFile(); 
       return true; 
      case 4: 
       return false; 
      default: 
       return true; 
     } 

    } 
} 
class Person 
{ 
    private long choiceOfPerson = 0; 
    private string completeInfo = ""; 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public long personalIdentityNumber { get; set; } 
    public string Gender { get; set; } 
    DateTime dateOfBirth = new DateTime(); 
    Dictionary<long, string> list = new Dictionary<long, string>(); 

    public void createPerson() 
    { 
     Console.WriteLine("Enter personal identity number"); 
     personalIdentityNumber = long.Parse(Console.ReadLine()); 
     Console.WriteLine("Enter your first Name"); 
     firstName = Console.ReadLine(); 
     Console.WriteLine("Enter your last name"); 
     lastName = Console.ReadLine(); 
     Console.WriteLine("Enter your gender"); 
     Gender = Console.ReadLine(); 
     Console.WriteLine("Enter your date of birth: DD/MM/YYYY"); 
     bool error = true; 
     { 
      while (error) 
       try 
       { 
        dateOfBirth = DateTime.Parse(Console.ReadLine()); 
        error = false; 
       } 
       catch (FormatException fEx) 
       { 
        Console.WriteLine(fEx.Message); 

       } 
     } 
     completeInfo = firstName + " " + lastName + " " + Gender + " " + dateOfBirth.ToString("dd/MM/yyyy"); 
     list.Add(personalIdentityNumber, completeInfo); 
    } 
    public void removePeople() 
    { 
     foreach (KeyValuePair<long, string> entry in list) 
     { 
      Console.WriteLine(completeInfo + " " + personalIdentityNumber); 
     } 
     Console.WriteLine("Write the perosnal identity number of person you wish to delete"); 
     choiceOfPerson = long.Parse(Console.ReadLine()); 
     list.Remove(choiceOfPerson); 
    } 
    public void saveToFile() 
    { 
     foreach (KeyValuePair<long, string> entry in list) 
     { 
      File.WriteAllText(@"E:\gry\info2.txt", completeInfo + personalIdentityNumber); 
     } 
    } 
} 

}

+5

這是因爲在'Menu'中你每次都創建一個擁有自己'list'的新人 – litelite

回答

2

您的人員列表設置在Person類中。如果您創建Person的新實例,則另一個會被銷燬。相反,你應該將你的列表引用保存在Person之外並放入你的Program類中。

您應該只從Person類的外部操縱您的列表。 Person類只是表示您的Person的對象。它不能包含它自己的列表。

class Program 
{ 
    private static Dictionary<long, string> list = new Dictionary<long, string>(); 

    static void Main(string[] args) 
    { 
     bool menu = true; 
     while (menu) 
      { 
      menu = Menu(); 
      } 
    } 
    public static bool Menu() 
    { 
     Person person = new Person(); 
     int choice; 
     Console.WriteLine("1. Add person"); 
     Console.WriteLine("2. Delete person"); 
     Console.WriteLine("3. Save data to text file"); 
     Console.WriteLine("4. Exit"); 
     choice = int.Parse(Console.ReadLine()); 
     switch(choice) 
     { 
      case 1: 
       person.createPerson(); 
       var personInfoKey = string.Format("{0} {1} {2} {3}", person.firstName, person.lastName, person.Gender, person.dateOfBirth); 
       list.Add(person, personInfoKey); 
       return true; 
      case 2: 
       person.removePeople(); 
       list.Remove(person); 
       return true; 
      case 3: 
       person.saveToFile(); 
       return true; 
      case 4: 
       return false; 
      default: 
       return true; 
     } 

    } 
} 
class Person 
{ 
    private long choiceOfPerson = 0; 
    private string completeInfo = ""; 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public long personalIdentityNumber { get; set; } 
    public string Gender { get; set; } 
    DateTime dateOfBirth = new DateTime(); 

    public void createPerson() 
    { 
     Console.WriteLine("Enter personal identity number"); 
     personalIdentityNumber = long.Parse(Console.ReadLine()); 
     Console.WriteLine("Enter your first Name"); 
     firstName = Console.ReadLine(); 
     Console.WriteLine("Enter your last name"); 
     lastName = Console.ReadLine(); 
     Console.WriteLine("Enter your gender"); 
     Gender = Console.ReadLine(); 
     Console.WriteLine("Enter your date of birth: DD/MM/YYYY"); 
     bool error = true; 
     { 
      while (error) 
       try 
       { 
        dateOfBirth = DateTime.Parse(Console.ReadLine()); 
        error = false; 
       } 
       catch (FormatException fEx) 
       { 
        Console.WriteLine(fEx.Message); 

       } 
     } 
     completeInfo = firstName + " " + lastName + " " + Gender + " " + dateOfBirth.ToString("dd/MM/yyyy"); 
     list.Add(personalIdentityNumber, completeInfo); 
    } 
    public void removePeople() 
    { 
     foreach (KeyValuePair<long, string> entry in list) 
     { 
      Console.WriteLine(completeInfo + " " + personalIdentityNumber); 
     } 
     Console.WriteLine("Write the perosnal identity number of person you wish to delete"); 
     choiceOfPerson = long.Parse(Console.ReadLine()); 
     list.Remove(choiceOfPerson); 
    } 
    public void saveToFile() 
    { 
     foreach (KeyValuePair<long, string> entry in list) 
     { 
      File.WriteAllText(@"E:\gry\info2.txt", completeInfo + personalIdentityNumber); 
     } 
    } 
} 
+0

您可能希望將CreatePerson,Remove等方法放入Program類中,以使其更清潔。 – Cratebox99

0

你的 「名單」 是在你的Person類的範圍。它需要在你的程序類的範圍內。

-2
using System.Linq; 

var text = string.Join(Environment.NewLine), list.Select(entry => $" 
         {completeInfo} {personalIdentityNumber}")); 
File.WriteAllText(path, text); 
+1

歡迎來到[so]!爲什麼以及如何解決問題?那些能夠自己回答這些問題的人不需要別人的代碼。 – jpaugh