2017-10-17 30 views
1

我正在創建一個小程序,它接受用戶輸入(字符串和小數),並在菜單中選擇「查看摘要」選項時將其打印回用戶。如何在集合中保存具有多個變量類型的對象以稍後調用?

菜單根據用戶輸入循環切換,帳戶名稱/帳戶餘額將在請求/輸入後立即打印,但是一旦選擇了選項3,我就無法保存並打印它們。儘管有任何投入,「視圖總結」表示資產爲0,債務爲0。

Account類有一個字符串名稱和十進制餘額,我只希望它保存到用戶完成。 (無數據庫只是試圖讓概念現在)

我的主要問題:
這是因爲循環/應該名單是他們之外捕獲數據?
字典是一個更好的主意,我可以從一個空集合開始?

static void Main(string[] args) 
{ 
    string menuChoice; 
    string response; 

    do 
    { 
     // Welcome/Menu screen 
     Console.WriteLine("\nWelcome to your Net Worth Calculator.\n \n MENU:\n 1. Add Asset\n 2. Add Debt\n 3. View Summary"); 
     Console.WriteLine(" "); 
     Console.WriteLine("What would you like to do?\nPlease make a selection: "); 

     menuChoice = Console.ReadLine(); 

     Account asset = new Account(); 
     var accountList = new List<Account>(); 

     if (menuChoice == "1") 
     { 
      do 
      { //D1 
       Console.WriteLine("\nGreat! Let's add an account."); 
       Console.WriteLine("Account name:"); 
       asset.name = Console.ReadLine(); 
       Console.WriteLine("Your account name is: " + asset.name); 

       Console.WriteLine("\nWhat is your current account balance with " + asset.name + "?"); 
       Console.WriteLine("Balance:"); 
       asset.balance = Decimal.Parse(Console.ReadLine()); 

       accountList.Add(asset); 

       Console.WriteLine("Your balance with " + asset.name + " is currently $" + asset.balance + "."); 

       Console.WriteLine("\n\nWould you like to add another account? y/n"); 
       response = Console.ReadLine(); 
      } while (response != "n"); 

     } 

     if (menuChoice == "3") 
     { 
      //D3 
      Console.WriteLine("Let's take a look at the accounts and balances that you've added so far:"); 
      Console.WriteLine($"{asset.balance} is your asset, and {debt.balance} is your debt."); 
      decimal netWorth = asset.balance - debt.balance; 
      Console.WriteLine(netWorth); 

      Console.WriteLine($"{ asset.balance}"); 
      Console.WriteLine("\n\nWould you like to add another account? y/n"); 
      response = Console.ReadLine(); 
     } 
+0

您正在使用的WriteLine格式特定於C#6.0。你在使用該版本嗎? – user2867342

+0

這基本上就是你說的,你在循環內創建一個'accountList'的新實例,所以每次你都會丟失上次的數據。將它移到循環之外。您需要更改'if'語句中的代碼以進行選擇3以遍歷'accountList'來彙總必要的數據。 – Equalsk

+0

您可能希望每次在循環周圍創建一個新的Account對象。目前,您只是分配給同一個實例並將其重新添加到集合 – user2867342

回答

1

爲accountList必須輸入外循環,這樣就沒有哪個選項被選中的事,你都可以訪問它(讀或寫)。

事情是這樣的:

static void Main(string[] args) 
{ 
    string menuChoice; 
    string response; 
    var accountList = new List<Account>(); 

    // Welcome/Menu screen 
    Console.WriteLine("\nWelcome to your Net Worth Calculator.\n \n MENU:\n 1. Add Asset\n 2. Add Debt\n 3. View Summary"); 
    do 
    { 
     Console.WriteLine(" "); 
     Console.WriteLine("What would you like to do?\nPlease make a selection: "); 

     menuChoice = Console.ReadLine(); 

     if (menuChoice == "1") 
     { 
      do 
      { //D1 
       Account asset = new Account(); 
       Console.WriteLine("\nGreat! Let's add an account."); 
       Console.WriteLine("Account name:"); 
       asset.name = Console.ReadLine(); 
       Console.WriteLine("Your account name is: " + asset.name); 

       Console.WriteLine("\nWhat is your current account balance with " + asset.name + "?"); 
       Console.WriteLine("Balance:"); 
       asset.balance = Decimal.Parse(Console.ReadLine()); 

       accountList.Add(asset); 

       Console.WriteLine("Your balance with " + asset.name + " is currently $" + asset.balance + "."); 

       Console.WriteLine("\n\nWould you like to add another account? y/n"); 
       response = Console.ReadLine(); 
      } while (response != "n"); 

     } 

     if (menuChoice == "3") 
     { 
      //D3 
      Console.WriteLine("Let's take a look at the accounts and balances that you've added so far:"); 
      Console.WriteLine($"{asset.balance} is your asset, and {debt.balance} is your debt."); 
      decimal netWorth = asset.balance - debt.balance; 
      Console.WriteLine(netWorth); 

      Console.WriteLine($"{ asset.balance}"); 
      Console.WriteLine("\n\nWould you like to add another account? y/n"); 
      response = Console.ReadLine(); 
     } 
+0

要正確計算'netWorth',您可能需要迭代'accountList'中的每個'Account'。否則,您只是讀取最近添加的帳戶的餘額。 – Serge

0
do 
{ 
    // ... 

    Account asset = new Account(); 
    var accountList = new List<Account>(); 

    // ... 

    if (menuChoice == "3") 
    { 

     Console.WriteLine($"{asset.balance} is your asset, and {debt.balance} is your debt."); 
    } 
} while (/* ... */); 

你宣佈一個新的assset對象和每個菜單循環的accountList。當然,當您打印時,assset.balance將爲零,因爲當您選擇菜單選項#3時它總是一個新的新對象。

你應該將列表中的菜單循環之外:

static void Main(string[] args) 
{ 
    string menuChoice; 
    string response; 
    var accountList = new List<Account>(); 

    do { // ... 

;創建內部菜單選項#1 Account一個新實例:

if (menuChoice == "1") 
    { 
     do 
     { //D1 
      var asset = new Account(); 
      // ... rest of your code 
     } while (response != "n"); 
    } 

至於計算資產和債務,你需要分別找到正數或負數的所有帳戶:

var assets = accountList.Where(x => x.balance > 0).Sum(x => x.balance); 
// assuming that you used negative value for debt 
var debts = accountList.Where(x => x.balance < 0).Sum(x => x.balance); 

理想情況下,你會想要兩個不同類型的Account少亂碼:

public abstract class Account 
{ 
    public string Name { get; set; } 
    public decimal Balance { get; set; } 
} 

public class Asset : Account { } 
public class Debt : Account { } 

// in option #3 
accountList.OfType<Asset>().Sum(x => x.Balance); 
0

的一個問題是完全按照你所描述的,因爲你在每次循環創建的accountList一個新實例它丟失了上次的信息。如下所示將它移到循環外部。

我想你可以使用Dictionary<string, decimal>如果你想。好處是它不允許重複鍵,並允許您通過鍵訪問值。如果你不需要這些東西,那麼List<T>就像現在一樣好。

有其他一些問題,所以我已經採取了一些調戲你的代碼,但我相信下面的你想要做什麼:

void Main() 
{ 
    string menuChoice; 
    string response; 
    var accountList = new List<Account>(); 
    var debtList = new List<Debt>(); 

    do 
    { 
     response = ""; 
     Console.WriteLine("\nWelcome to your Net Worth Calculator.\n \n MENU:\n 1. Add Asset\n 2. Add Debt\n 3. View Summary\n 4. Quit"); 
     Console.WriteLine(" "); 
     Console.WriteLine("What would you like to do?\nPlease make a selection: "); 

     menuChoice = Console.ReadLine(); 

     if (menuChoice == "1") 
     { 
      do 
      { 
       Account asset = new Account(); 

       Console.WriteLine("\nGreat! Let's add an account."); 
       Console.WriteLine("Account name:"); 
       asset.name = Console.ReadLine(); 
       Console.WriteLine("Your account name is: " + asset.name); 

       Console.WriteLine("\nWhat is your current account balance with " + asset.name + "?"); 
       Console.WriteLine("Balance:"); 
       asset.balance = Decimal.Parse(Console.ReadLine()); 

       accountList.Add(asset); 

       Console.WriteLine("Your balance with " + asset.name + " is currently $" + asset.balance + "."); 

       Console.WriteLine("\n\nWould you like to add another account? y/n"); 
       response = Console.ReadLine(); 
      } while (response != "n"); 
     } 

     if (menuChoice == "2") 
     { 
      do 
      { 
       Debt debt = new Debt(); 

       Console.WriteLine("\nGreat! Let's add a debt."); 
       Console.WriteLine("Debt name:"); 
       debt.name = Console.ReadLine(); 
       Console.WriteLine("Your debt name is: " + debt.name); 

       Console.WriteLine("\nWhat is your current debt balance with " + debt.name + "?"); 
       Console.WriteLine("Balance:"); 
       debt.balance = Decimal.Parse(Console.ReadLine()); 

       debtList.Add(debt); 

       Console.WriteLine("Your balance with " + debt.name + " is currently $" + debt.balance + "."); 

       Console.WriteLine("\n\nWould you like to add another debt? y/n"); 
       response = Console.ReadLine(); 
      } while (response != "n"); 
     } 

     if (menuChoice == "3") 
     { 
      var totalAsset = accountList.Sum(x => x.balance); 
      var totalDebt = debtList.Sum(x => x.balance); 

      Console.WriteLine("Let's take a look at the accounts and balances that you've added so far:"); 
      Console.WriteLine($"{totalAsset} is your asset, and {totalDebt} is your debt."); 
      decimal netWorth = totalAsset - totalDebt; 
      Console.WriteLine($"Net worth: {netWorth}"); 

      Console.WriteLine("\n\nPress any key to return to the menu"); 
      Console.ReadLine(); 
     } 
    } while (menuChoice != "4"); 
} 

public class Account 
{ 
    public string name {get;set;} 
    public decimal balance {get;set;} 
} 

public class Debt 
{ 
    public string name {get;set;} 
    public decimal balance {get;set;} 
} 

摘要:

  • 感動accountList外循環所以它不會在下一次迭代中被刪除
  • 添加debtList追蹤債務(假設您有這個但沒有顯示它?)
  • 的菜單選項2新增部分(再次假設你只是錯過了嗎?)
  • 在菜單選項更改了3個邏輯顯示總計正確
  • 新增邏輯菜單選項4(退出)選擇何時退出

根據共同的帳戶/債務份額,您可能只能擁有一個班級而不是兩個班級。

+0

我有一個既具有名稱又具有餘額的賬戶類,然後從中創建資產和債務。當我創建accountList時,我可以擁有一個,還是需要將它們分開? –

+0

嗯,我想這取決於當你創建一個你沒有顯示的債務時會發生什麼。如果這只是一個負餘額帳戶,那麼我想你可以有一個班級和一個列表。菜單3中的邏輯需要稍微調整。也許如果你顯示你爲菜單2做了什麼來創造債務,我可以告訴。 – Equalsk

相關問題