首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能在不丢失原始引用的情况下删除列表列表中的项?

是否有可能在不丢失原始引用的情况下删除列表列表中的项?
EN

Stack Overflow用户
提问于 2013-05-24 18:40:08
回答 5查看 3K关注 0票数 6

好吧,这是一个有点困难的问题,但我会尝试。我有一个对象列表(地块),它同样包含一个对象列表(晶片)。当我更改晶圆内的值时,它将在两个列表中都更改!这就是我想要的。但是当我想要从复制的列表中删除晶圆时,不应该将其从原始列表中删除。因此,我希望在每个批次中都有一个新的晶圆列表,但对晶圆的引用应该与原始批次中的相同,因为我想更改晶片的值,它应该更改原始晶片和复制的晶片中的值。有没有可能没有深度复制?

为了更好地解释它,我有以下代码:

代码语言:javascript
运行
复制
    public class Lot
    {
        public string LotName { get; set; }

        public List<Wafer> Wafers { get; set; }
    }

    public class Wafer
    {
        public string WaferName { get; set; }

    }
    [Test]
    public void ListInListTest()
    {
                    //Some Testdata

        List<Lot> lotList = new List<Lot>();
        Lot lot = new Lot();
        lot.LotName = "Lot1";
        lot.Wafers = new List<Wafer>();
        Wafer wafer = new Wafer();
        wafer.WaferName = "Wafer1";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer2";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer3";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer4";
        lot.Wafers.Add(wafer);
        lotList.Add(lot);

        lot = new Lot();
        lot.LotName = "Lot1";
        lot.Wafers = new List<Wafer>();
        wafer = new Wafer();
        wafer.WaferName = "Wafer1";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer2";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer3";
        lot.Wafers.Add(wafer);
        wafer = new Wafer();
        wafer.WaferName = "Wafer4";
        lot.Wafers.Add(wafer);
        lotList.Add(lot);

         //Copy the List
        List<Lot> copyList = CopyList(lotList);

        //That works. It removes the lot just in the copyList but not in 
        //the original one
        copyList.RemoveAt(1);

        //This works not like i want. It removes the wafers from the copied list
        //and the original list. I just want, that the list will be changed
        //in the copied list
        copyList[0].Wafers.RemoveAt(0);


    }

    private List<Lot> CopyList(List<Lot> lotList)
    {
        List<Lot> result = new List<Lot>(lotList);

        foreach (Lot lot in result)
        {
            lot.Wafers = new List<Wafer>(lot.Wafers);
        }

        return result;
    }

我希望它不是那么令人困惑?我希望我的问题被解释得足够好。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-24 20:06:45

据我所知,没有开箱即用的方法可以让你做你想做的事情。以下是原因的简要说明:

List<Lot> (最左侧)包含对Lot对象的引用,而该对象又包含对其两个成员变量的引用。

如果您希望对LotNameWafers列表组成部分的更改按照您的描述进行传播,最简单的解决方案是在列表之间共享对Lot对象的引用:

现在,您可以看到为什么不能使用此解决方案单独修改Wafers列表中的项-您无法摆脱使用相同对象引用的事实!

通过共享引用,你失去了控制行为差异的能力。为了实现您想要的,我认为您必须对Lot实例进行深度复制,然后您可以通过某种Observer模式来管理更改的传播。

票数 4
EN

Stack Overflow用户

发布于 2013-05-24 20:14:27

我想我知道你的问题出在哪里了。在您的CopyList中,您可以有效地克隆列表,即

代码语言:javascript
运行
复制
lot.Wafers = new List<Wafer>(lot.Wafers);

但是,这里需要注意的关键点是,对Lot对象的引用仍然是相同的-因此,您实际上是在克隆和替换原始列表上的Wafers属性。

当你调用

代码语言:javascript
运行
复制
copyList.RemoveAt(1);

这很好,因为您正在操作Lot列表的副本。但是,当您调用

代码语言:javascript
运行
复制
copyList[0].Wafers.RemoveAt(0);

您正在修改仍由两个列表引用的Lot实例。要解决这个问题,您需要克隆Lot对象本身,以有效地更改引用,即

代码语言:javascript
运行
复制
List<Lot> result = new List<Lot>(lotList.Count);
foreach (Lot item in lotList)
{
    result.Add(new Lot()
    {
        LotName = item.LotName,
        Wafers = new List<Wafer>(item.Wafers)
    });
}

因此,您将在两个列表中丢失Lot对象本身的自动更新,但您仍然可以在修改单个Wafer对象时保留它(因为对它们的引用不会改变)。

所以总而言之,你有效地问的是:

如何在拥有不同的属性引用的同时保持相同的对象引用?

这个问题的答案是--你不能。

票数 7
EN

Stack Overflow用户

发布于 2013-05-24 18:52:28

问题是,您通过维护与主列表的引用来创建克隆列表。你应该使用类似这样的东西:

代码语言:javascript
运行
复制
private List<Lot> CopyList(List<Lot> list)
{
   List<Lot> clone = new List<Lot>();

   foreach(Lot l in list)
   {
      List<Wafer> wafers = new List<Wafer>();
      foreach(Wafer w in l.Wafers)
         wafers.Add(w);

      clone.Add(new Lot(){ LotName = l.LotName, Wafers = wafers });
   }

   return clone;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16733097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档