【问题标题】:Make a clone of an instanced with all the stored values使用所有存储的值创建一个实例的克隆
【发布时间】:2019-12-22 11:48:21
【问题描述】:

我有两个类,一个叫做仓库,一个叫做 Warehouselocations。 wareHouse 目前可以在仓库位置创建、存储和查找箱子。

但现在我还需要仓库能够使用所有存储的信息创建 wareHouseLocation 的克隆版本。

   locations = new List<WareHouseLocation>();

这是我存储所有信息的列表。我希望能够复制它。

我试图自己找到答案,甚至尝试了一些代码,但到目前为止,我没有任何东西可以正常工作。

    public WareHouseLocation DeepCopy() 
    {
        foreach (WareHouseLocation  wareHouseLocation in locations)
            {
                if(wareHouseLocation == null) 
                {
                    return null;
                }
                else 
                {
                   //Need code here
                }
              }
           return null;
        }

代码当前在 wareHouse 类中。 我很高兴任何可以帮助我的事情。

    public class WareHouseLocation
    {
        public int FloorID { get; set; }
        public List<I3DStorageObject> storage = new List<I3DStorageObject>();


        public double MaxVolume;
        public double MaxWeight;

        public WareHouseLocation(double height, double width, double depth)
        {
            MaxVolume = height * width * depth;
            MaxWeight = 1000;
        }


        public bool hasAvailableVolumeForObject(I3DStorageObject s)
        {
            double currentVolume = 0;


            foreach (I3DStorageObject obj in storage)
            {
                currentVolume += obj.Volume;
            }

            double available = MaxVolume - currentVolume;


            if (s.Volume <= available)
            {
                return true;
            }
            else
            {
                return false;
            }

        }



    }

这是 WareHouseLocation 的代码。

【问题讨论】:

  • 您的返回类型仅适用于 1 个实例,您是从列表变为单例吗?
  • 对于列表的深层副本(不是包含的实例)var newLocations = sourceInstance.locations.ToList(); ?还是您在寻找列表中每个实例的深层副本?
  • 除此之外,我们也不知道WareHouseLocation 中的内容(顺便说一下,应该可能WarehouseLocation,因为“仓库”只是一个词)。如果您发布WareHouseLocation 的代码,我们将能够帮助您解决如何克隆一个...
  • I3DStorageObject 是什么,引用或值类型?
  • I3DStorage 是参考类型。

标签: c# deep-copy


【解决方案1】:

可以通过实现ICloneable接口来实现:

public class WareHouseLocation : ICloneable
{
    public int FloorID { get; set; }
    public List<I3DStorageObject> storage = new List<I3DStorageObject>();

    public double MaxVolume;
    public double MaxWeight;

    //rest of code

    public object Clone()
    {
        var copy = (WareHouseLocation)MemberwiseClone();
        copy.storage = storage.Select(item => (I3DStorageObject)item.Clone()).ToList();

        return copy;
    }
}

由于您在WareHouseLocation 中有一个List 引用类型,因此您还需要通过为I3DStorageObject 实现ICloneable 来正确克隆它,因为MemberwiseClone 仅复制引用,而不是引用对象本身

public class I3DStorageObject : ICloneable
{
    public double Volume { get; set; }
    public object Clone()
    {
        return MemberwiseClone();
    }
}

您还可以查看MemberwiseClone 了解对象的深/浅复制的详细信息和示例

【讨论】:

  • 谢谢!我相信这正是我在寻找的。我已经尝试了几个小时来实际实现一种克隆对象的方法。但完全错过了ICloneable 现在完美运行!
【解决方案2】:

我认为您可以使用 JsonConvert.SerializeObject 和 JsonConvert.DeserializeObject 进行复制,

    var json = JsonConvert.SerializeObject(put_your_object_here);
    var copy = JsonConvert.DeserializeObject<your_object_type>(json);

【讨论】:

  • 这似乎是一种非常低效的克隆操作方式。我们不知道 WareHouseLocation 类中有什么,但我怀疑直接克隆会很简单。
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2014-06-04
  • 2015-02-07
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多