none
层次集合(树结构)的读写

    问题

  • 假设有AB两个静态(要求是静态)层次结构的集合。生成A后,直接把A赋值给B,好像二者实际还是指向同一个内存。因此,改动B数据,A也会相应变化。我的问题是:希望改动B而不影响A。似乎有以下方案:

    1、  如果采用一边读A的各个层次的数据,一边生成B的对应层次数据,应该可以满足我的要求。这好像应该采用递归方式实现,即递归读A的数据,同时,递归生成B的数据。烦请老师们提供有关算法或有关参考资料。

    2、  不知道有没有更简便、直接的方式,根据A生成B,而且二者可拥有不同内存,即二者各自的改动互不影响。我试了使用如List的FindAll等方式,可以生成B数据,但解决不了二者的指向同一内存问题。

    我的问题比较初级,还望各位老师赐教,谢谢。


    ly_he

    2016年12月5日 9:22

全部回复

  • 将A深拷贝(deep copy)之后得到B,这样A,B就不再指向同一块内存,各自的变化也不会影响到对方。

    深拷贝是通过对象序列化的方法实现,主要格式有Xml,JSON,或二进制,一般二进制的效率最优。

    参考下面的代码:

    http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically

    public static T DeepClone<T>(T obj)
    {
     using (var ms = new MemoryStream())
     {
       var formatter = new BinaryFormatter();
       formatter.Serialize(ms, obj);
       ms.Position = 0;

       return (T) formatter.Deserialize(ms);
     }
    }

    将A集合传入上面的方法后生成B集合,B深拷贝A对象,之后A,B的各种变化互不影响。

    参考 Shallow Copy vs. Deep Copy in .NET (浅拷贝与深拷贝)

    https://www.codeproject.com/articles/28952/shallow-copy-vs-deep-copy-in-net



    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms



    • 已编辑 Shuanghua LiMVP 2016年12月5日 12:45
    • 已建议为答案 lctk 2017年1月6日 0:54
    2016年12月5日 12:41
  • Hi ly_he,

    >>" 希望改动B而不影响A "

    不管你使用什么语言来开发程序,如果你想希望改动B而不影响A,你就必须分配一块新的内存出来,然后指向新的内存。
    这样就不会影响,

    那么怎么得到和A一样的B呢?
    就需要你提供一个构造函数,这个构造函数的功能就是new 出一块内存,然后把A里面的值拷贝出来,并且赋值给B.
    此时B已经有新的内存了。这样就可以完成深拷贝的动作。

    所以要想相互不影响,就必须有自己的一块内存,这是关键。

    希望我的回复能帮助你理解深拷贝和浅拷贝。

    Best Regards,
    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月6日 2:29
    版主
  • 谢谢Shuanghua Li老师的回复和提供的重要参考资料。我一定认真的学习领会。

    ly_he

    2016年12月6日 4:58
  • Hi ly_he,

    如果你的问题得到解决,请及时标记有用的回复,作为答案,这样会帮助遇到相同问题的人。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年1月3日 6:55
    版主
  • 标记一下

    please verify my account

    2017年1月5日 6:27