【问题标题】:Adding a class in list<> and copying that class again and adding again with some modification在 list<> 中添加一个类并再次复制该类并再次添加并进行一些修改
【发布时间】:2019-07-25 14:17:48
【问题描述】:

首先,我将我的班级添加到列表中:

然后将该类复制到新类,并在更改日期后按照逻辑再次保存在列表中,但已保存在列表中的第一个元素的日期也正在更改。

看下图:

这是我的完整代码:

           if (Session["CompanyId"] != null)
            {
                
                List<CalendarList> CalendartableList = new List<CalendarList>();
                DateTime cldate = Convert.ToDateTime(CalendarList.DateDue);
                CalendarList.CompanyId = Convert.ToInt32(Session["CompanyId"]);
                CalendarList.Category = 15;
                CalendarList.Status = 1;
                CalendarList.Identifier = 232;
                CalendarList.Quarter = 5;
                CalendarList.IsCompleted = false;
                CalendarList.CalendarGUID = CalendarList.Description;
                CalendartableList.Add(CalendarList);

                DateTime po_Date = cldate;
                int pi_Count = 0;

                while (po_Date.Year == DateTime.Now.Year)
                {
                    pi_Count += 1;
                    switch (CalendarList.Interval)
                    {
                        case "Weekly":
                            {
                                po_Date = cldate.AddDays(7 * pi_Count);
                                break;
                            }

                        case "Biweekly":
                            {
                                po_Date = cldate.AddDays(14 * pi_Count);
                                break;
                            }

                        case "Monthly":
                            {
                                po_Date = cldate.AddMonths(1 * pi_Count);
                                break;
                            }

                        default:
                            {
                                po_Date = cldate.AddMonths(3 * pi_Count);
                                break;
                            }
                    }
                    if (po_Date.Year == DateTime.Now.Year)
                    {
                        CalendarList newlist = new CalendarList();
                        newlist = CalendarList;
                        newlist.DateDue = po_Date.ToString();
                        CalendartableList.Add(newlist);
                    }
                }

还有其他方法可以达到同样的效果吗?

【问题讨论】:

  • 您必须创建一个副本。您首先要创建一个实际上不是副本的新 CalendarList,然后将其扔掉而不碰它。您将其替换为原始对象。相反,创建一个实际的完整副本(我会给 CalendarList 一个 Clone() 方法,正如史蒂夫建议的那样)。稍微切线,我会敦促您将DateDue 属性(或字段?)设置为DateTime 而不是字符串,并且仅在需要将其显示给用户时将其转换为字符串。
  • 尝试使用正确的术语。您不会将课程添加到列表中,也不会复制课程。您正在复制和添加 对象

标签: c# list class collections


【解决方案1】:

您需要记住的是,您正在将reference 添加到您的object,而不是该对象的副本到列表中。最简单的解决方法是将.Clone() 方法添加到您的object 以获取其自身的副本并将其创建为新的object。克隆的副本可以独立于原始副本进行修改。

【讨论】:

    【解决方案2】:

    CalendarListclass(也许你在你的一张图片中展示了这个,但我看不到它们)?如果是这样,那么它就是Reference Type

    C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含它们的数据。使用引用类型,两个变量可以引用同一个对象;因此,对一个变量的操作会影响另一个变量引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量(除了 in、ref 和 out 参数变量的情况;参见 in、ref 和 out 参数修饰符)。

    因此,当您调用newlist = CalendarList 时,您并没有将值从CalendarList 复制到newlist,而是将newlist 设置为引用与CalendarList 完全相同的对象。当您通过newlist 变量修改对象时,您将通过CalendarList 变量“看到”这些修改,因为它们都引用同一个对象。

    如果您想要两个不同的对象,则必须手动将值从 CalendarList 复制到 newlist

    CalendarList newlist = new CalendarList
    {
       CompanyId = CalendarList.CompanyId,
       Category = CalendarList.Category
       //etc, etc...
    }
    

    请注意,如果CalendarList 类的属性也是引用类型,您将遇到类似的行为。在我上面的例子中,newlist.Category 引用了与CalendarList.Category 完全相同的对象。因此,对Categorynewlist 的修改将在CalendarList.Category 中可见。

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2019-05-03
      • 2015-11-10
      • 1970-01-01
      相关资源
      最近更新 更多