如何管理指向同一集合的两个列表对象引用

本文关键字:两个 对象引用 列表 集合 何管理 管理 | 更新日期: 2023-09-27 18:29:24

在运行时,我的程序分配两个具有相同集合的属性。我取了两个属性,这样,如果更改为集合将由一个属性完成,第二个属性将保持相同的集合。但在场景后面,两个属性都指向同一个,如果不更改一个属性,我就无法保持集合。我需要这个来确定和取消按钮,这样如果没有更改,一个属性会处理这个,如果进行了更改,另一个属性也会处理这个。

我该怎么办?

像这个

private void btnOK_Click(object sender, EventArgs e)
        {
            Program.currOrder.OrderItems[Program.editIndex].AppliedCustomization = lstBtn;//objFreecusatomization.AllAppliedItems;
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }
        private void btnCancel_Click(object sender, EventArgs e)
        {
            Program.currOrder.OrderItems[Program.editIndex].AppliedCustomization = actualBtnLIst;
            this.DialogResult = DialogResult.Cancel;
        }

这是从其他程序中分类出来的两个属性

public List<btnObject> lstBtn;
        public List<btnObject> actualBtnLIst { get; set; }

从其他程序这是如何设置

  frmPrepare.actualBtnLIst = frmPrepare.lstBtn = Program.currOrder.OrderItems[currIdx].AppliedCustomization;

如何管理指向同一集合的两个列表对象引用

有两个选项,要么在创建实际列表时,从原始列表中获取所有项目,并将其填充到新列表中。假设在for循环中(逐个传输所有属性的值),您也可以对其使用反射。

另一种方法是,如果对象是序列化的,那么首先序列化原始列表,然后反序列化它,使其按值而不是按引用进行复制。

对于第二个选项,代码将如下所示:

using (var memoryStream = new MemoryStream())
{
   var binaryFormatter = new BinaryFormatter();
   binaryFormatter.Serialize(memoryStream, <Your Original List Object>);
   memoryStream.Position = 0;
   <You actual List Object> =  binaryFormatter.Deserialize(memoryStream);
}

很难说你在问什么,但如果你想保留原始列表的副本,你需要制作一个副本,而不是分配引用。

frmPrepare.lstBtn = Program.currOrder.OrderItems[currIdx].AppliedCustomization;
frmPrepare.actualBtnLIst = frmPrepare.lstBtn.ToList();
// ToList will create a copy of each item reference in the collection.