2017-10-17 45 views
1

Je crée un petit programme qui prend les entrées de l'utilisateur (chaîne et décimale) et les réimprimera à l'utilisateur quand ils choisissent l'option "View Summary" dans le menu.Comment puis-je enregistrer un objet avec plusieurs types de variables dans une collection à appeler plus tard?

Les menus défilent en fonction des entrées utilisateur et le nom du compte/les soldes de compte s'imprimeront immédiatement après leur demande/entrée, mais je ne peux pas les enregistrer et imprimer lorsque l'option 3 est sélectionnée. Malgré toutes les entrées, le «View Summary» indique que les actifs sont 0 et les dettes sont 0 à chaque fois.

La classe Account a un nom de chaîne et une balance décimale, et je veux seulement qu'elle soit sauvegardée jusqu'à ce que l'utilisateur ait terminé. (. Aucune base de données juste essayer d'obtenir des concepts pour l'instant)

Mes principales questions:
est-ce à cause des boucles/la liste doit être en dehors d'eux pour capturer des données?
un dictionnaire serait-il une meilleure idée, et puis-je commencer avec une collection vide?

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

La mise en forme WriteLine que vous utilisez est spécifique à C# 6.0. Utilisez-vous cette version? – user2867342

+0

C'est essentiellement ce que vous avez déjà dit, vous créez une nouvelle instance de 'accountList' dans la boucle, donc à chaque fois vous perdez les données de la dernière fois. Déplacez-le en dehors de la boucle. Vous devrez changer le code à l'intérieur de l'instruction 'if' pour le choix 3 afin de faire défiler' accountList' pour additionner les données nécessaires. – Equalsk

+0

Vous pouvez créer un nouvel objet compte à chaque fois autour de la boucle. Actuellement, vous affectez simplement la même instance et vous la réajoutez à la collection. – user2867342

Répondre

1

accountList doit être en dehors de la boucle d'entrée, de sorte que peu importe quelle option est sélectionnée, vous êtes en mesure d'y accéder (lecture ou écriture).

Quelque chose comme ceci:

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

Pour calculer correctement 'netWorth', vous voulez probablement parcourir chaque' Account' dans 'accountList'. Sinon, vous lisez simplement le solde du dernier compte ajouté. – 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 (/* ... */); 

Vous déclarez un nouvel objet assset et la accountList sur chaque boucle de menu. Bien sûr, assset.balance serait zéro lorsque vous imprimez, car il sera toujours un nouvel objet lorsque vous choisissez l'option de menu # 3.

Vous devez déplacer la liste en dehors de la boucle de menu:

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

    do { // ... 

Et, créez une nouvelle instance de Account dans l'option de menu # 1:

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

En ce qui concerne le calcul de la actifs et dettes, vous devez trouver tous les comptes avec des nombres positifs ou des nombres négatifs, respectivement:

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); 

Idéalement, vous voulez deux différents types de Account pour le code moins salissant:

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

Une question est exactement comme vous l'avez décrit, parce que vous créez une nouvelle instance de accountList à chaque itération de la boucle il perd l'information de la dernière fois. Déplacez-le en dehors de la boucle comme indiqué ci-dessous.

Je suppose que vous pourriez utiliser un Dictionary<string, decimal> si vous le vouliez. L'avantage est qu'il n'autorise pas les clés en double et vous permet d'accéder aux valeurs par clé. Si vous n'avez besoin d'aucune de ces choses, alors un List<T> est bien comme vous l'avez maintenant.

Il y avait d'autres questions, donc j'ai pris quelques libertés avec votre code, mais je crois que le ci-dessous ce que vous ne voulez:

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;} 
} 

Résumé:

  • Moved accountList en dehors de la boucle donc il ne sera pas effacé à la prochaine itération
  • Ajouté debtList pour suivre la dette (supposons que vous aviez ceci mais ne l'ai pas montré?)
  • Ajout d'une section pour l'option de menu 2 (en supposant à nouveau que vous venez manqué?)
  • logique Changed dans l'option de menu 3 pour afficher les totaux correctement
  • logique Ajouté à la sortie lorsque l'option de menu 4 (quitter) est choisi

Selon le compte/la part de la dette commune, il se peut que vous puissiez avoir une classe au lieu de deux.

+0

J'ai une classe pour le compte qui a à la fois le nom et le solde, puis créé l'actif et la dette de celui-ci. Lorsque je crée la liste de comptes, puis-je en avoir un ou dois-je toujours les séparer? –

+0

Eh bien, je suppose que cela dépend de ce qui se passe lorsque vous créez une dette que vous n'avez pas montré. Si c'est juste un compte avec un solde négatif alors je suppose que vous pourriez avoir une classe et une liste. La logique du menu 3 devrait être légèrement modifiée. Peut-être que si vous montrez ce que vous faites pour le menu 2 pour créer une dette, je serais capable de le dire. – Equalsk