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

时间:2013-08-28 12:41:49

标签: c#

在运行时,我的程序使用相同的集合分配2个属性。 我拿了两个属性,这样如果更改为集合将由一个属性完成,第二个将保持相同的集合。但是在场景背后都指向同一个,我不能保持集合而不改变一个属性。 我要求这个确定并取消按钮,这样如果没有变化,一个属性会照顾或这个,如果做了更改,其他属性将负责处理。

我该如何管理?

像这样

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

这些是从其他一些程序中确定的2个属性

public List<btnObject> lstBtn;
        public List<btnObject> actualBtnLIst { get; set; }
从其他程序

这是如何设置

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

2 个答案:

答案 0 :(得分:1)

很难说出你在问什么,但如果你想保留原始列表的副本,你需要复制而不是分配参考。

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

答案 1 :(得分:1)

创建实际列表时有两个选项,从原始列表中获取所有项目并将其填入新列表中,假设在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);
}