List.Add()覆盖了我以前的值

时间:2018-08-06 03:21:42

标签: c#

这是一个名为Expense Manager的类

public void AddExpense(Expense currentExpense)
    {

        Console.Write("Enter date in this format (2017-08-26): ");
        currentExpense.date = DateTime.Parse(Console.ReadLine());


        Console.Write("Enter the description: ");
        currentExpense.description = Console.ReadLine();

        Console.Write("Enter the amount: ");
        currentExpense.amount = decimal.Parse(Console.ReadLine());

        expenseList.Add(currentExpense);

    }

    public void PrintReport()
    {
        Console.Write("{0, -20} {1, 20} {2, 25} {3, 40}", "Index", "Date", "Amount", "Description\n");

        Console.Write("{0, -20} {1, 20} {2, 25} {3, 40}", "-----", "----------", "----------", "----------------------\n");
        for (int i = 0; i < (expenseList.Count); i++)
        {
            Console.Write("{0, -20} {1, 20} {2, 25:C2} {3, 40}\n", i, expenseList[i].date.ToShortDateString(), expenseList[i].amount, expenseList[i].description);
        }
        Console.Write("{0, -20} {1, 20} {2, 25} {3, 40}", "-----", "----------", "----------", "----------------------\n");
        //Console.WriteLine("{0, 40} {1, 25:C2}", "\nTotal Amount:", expenseList[Count].amount);


    }

这是我的主要课程,我正在调用添加和打印列表中数据的方法。

 Expense myExpense = new Expense();
        ExpenseManager myExpenseManager = new ExpenseManager();

        //myExpenseManager.AddExpense(myExpense);
        int option = 8;

        while (option != 3)
        {


            Console.WriteLine("Enter 1 to add and 2 to print and 3 to exit");
            option = int.Parse(Console.ReadLine());
            switch (option)
            {
                case 1:
                    myExpenseManager.AddExpense(myExpense);
                    break;
                case 2:
                    myExpenseManager.PrintReport();
                    break;
                default:
                    break;
            }
        }

以下是输出(显示相同的内容):

 Index                                Date                    Amount                             
Description
-----                          ----------                ----------                  
----------------------
0                                7/8/2017                    $21.00                                    
njjnn
1                                7/8/2017                    $21.00                                    
njjnn
-----                          ----------                ----------                  
----------------------
Enter 1 to add and 2 to print and 3 to exit

它将覆盖我以前的值,并在列表中显示相同的值。我不知道是什么问题。我真的需要帮助

1 个答案:

答案 0 :(得分:1)

问题是您每次都使用相同的费用对象。

这样想,您有1个Expense存储桶,将其填充,然后将其放置在列表中,然后下次使用相同的存储桶并将其填充并添加到您的列表。

现在,当您打印报告时,将始终获得相同的值(最后一个值)。那是因为您使用的是相同的存储桶!

解决方法是创建一个新的Expense对象

case 1:
   Expense myExpense = new Expense();
   myExpenseManager.AddExpense(myExpense);

甚至更好的是,只需在AddExpense中创建它,甚至不需要将其传递给

public void AddExpense()
{
    Expense currentExpense = new Expense();
    Console.Write("Enter date in this format (2017-08-26): ");
    currentExpense.date = DateTime.Parse(Console.ReadLine());


    Console.Write("Enter the description: ");
    currentExpense.description = Console.ReadLine();

    Console.Write("Enter the amount: ");
    currentExpense.amount = decimal.Parse(Console.ReadLine());

    expenseList.Add(currentExpense);

}

更新

  

您能再多说明一点吗?为什么   'expenseList.Add(currentExpense)'不在最后添加内容

尽管您多次将费用添加到列表中,但您仅创建了一项费用。并且您会不断用最后一个值覆盖该值。

您有一个完全相同的费用清单,该清单仅被修改了几次。

Bucket 1
Add your values
Add it to your list

Bucket 1 
Add your values
Add it to your list

Bucket 1 = some expense
Add your values
Add it to your list

一天结束时,您会一遍又一遍地列出相同的费用

List
Item 1 = Bucket 1   
Item 2 = Bucket 1
Item 3 = Bucket 1
Item 4 = Bucket 1
Item 5 = Bucket 1

通过每次创建新费用

List
Item 1 = Bucket 1   
Item 2 = Bucket 2
Item 3 = Bucket 3
Item 4 = Bucket 4
Item 5 = Bucket 5