2017-08-10 103 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