数据结构通用算法(深拷贝+比较)

  1     public class CompareIgnoreAttribute : Attribute
  2     {
  3     };
  4
  5     [Serializable] // 深拷贝需要
  6     public abstract class DataInfo
  7     {
  8         // 快速深拷贝
  9         public static object copy(object th)
 10         {
 11             MemoryStream ms = new MemoryStream();
 12             BinaryFormatter bf = new BinaryFormatter();
 13             bf.Serialize(ms, th);
 14             ms.Seek(0, 0);
 15             object th2 = bf.Deserialize(ms);
 16             ms.Close();
 17             return th2;
 18         }
 19
 20         // 比较
 21         public static bool Equ(object th1, object th2)
 22         {
 23             try
 24             {
 25                 if (th1 == null || th2 == null)
 26                 {
 27                     if (th1 == null && th2 == null)
 28                     {
 29                         return true;
 30                     }
 31                     else
 32                     {
 33                         return false;
 34                     }
 35                 }
 36
 37                 if (th1.GetType() != th2.GetType())
 38                 {
 39                     return false;
 40                 }
 41
 42                 if (th1 is IList)
 43                 {
 44                     IList l1 = th1 as IList;
 45                     IList l2 = th2 as IList;
 46                     if (l1.Count != l2.Count)
 47                     {
 48                         return false;
 49                     }
 50                     else
 51                     {
 52                         for (int i = 0; i < l1.Count; ++i)
 53                         {
 54                             if (!DataInfo.Equ(l1[i], l2[i]))
 55                             {
 56                                 return false;
 57                             }
 58                         }
 59                     }
 60                 }
 61                 else if (th1.GetType().IsValueType || th1.GetType().IsEnum || th1.GetType() == typeof(string))
 62                 {
 63                     if (th1.ToString() != th2.ToString())
 64                     {
 65                         return false;
 66                     }
 67                 }
 68                 else
 69                 {
 70                     PropertyDescriptorCollection pdcs = TypeDescriptor.GetProperties(th1);
 71                     foreach (PropertyDescriptor pd in pdcs)
 72                     {
 73                         bool bIgnore = false;
 74                         // 检查是否有“比较忽略”属性,有则跳过检查
 75                         foreach (Attribute at in pd.Attributes)
 76                         {
 77                             if (at is CompareIgnoreAttribute)
 78                             {
 79                                 bIgnore = true;
 80                                 break;
 81                             }
 82                         }
 83
 84                         if (!bIgnore)
 85                         {
 86                             object ob1 = pd.GetValue(th1);
 87                             object ob2 = pd.GetValue(th2);
 88                             if (!DataInfo.Equ(ob1, ob2))
 89                             {
 90                                 return false;
 91                             }
 92                         }
 93                     }
 94                 }
 95             }
 96             catch (Exception)
 97             {
 98                 // 不应有异常
 99             }
100
101             return true;
102         }
103
104         //以下的方法仅给子类使用
105         public virtual DataInfo copy()
106         {
107             return DataInfo.copy(this) as DataInfo;
108         }
109         public virtual bool Equ(DataInfo th)
110         {
111             return DataInfo.Equ(this, th);
112         }
113     };

使用示例

 1     [Serializable] // 深拷贝需要
 2     public class Car : DataInfo
 3     {
 4         public string m_name;
 5         public string Name
 6         {
 7             get { return m_name; }
 8             set { m_name = value; }
 9         }
10
11         //[CompareIgnore] 加在这边没用
12         protected double m_price;
13         [CompareIgnore]
14         public double Price
15         {
16             get { return m_price; }
17             set { m_price = value; }
18         }
19
20         public Car(string name, double price)
21         {
22             this.m_name = name;
23             this.m_price = price;
24         }
25     }

进行深拷贝

1     class Program
2     {
3         static void Main(string[] args)
4         {
5             Car a = new Car("a", 199999.99);
6             Car b = a.copy() as Car;
7             Console.WriteLine("Name " + b.Name.ToString() + ";Price " + b.Price.ToString());
8         }
9     }

输出结果为:Name a;Price 199999.99

进行比较

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Car a = new Car("a", 99999.99);
 6             Car b = new Car("a", 199999.99);
 7             bool bSame = a.Equ(b);
 8             Console.WriteLine(bSame.ToString());
 9         }
10     }

输出结果为:True

数据结构通用算法(深拷贝+比较)

时间: 2024-11-02 17:01:39

数据结构通用算法(深拷贝+比较)的相关文章

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 栈 定义 后进者先出,先进者后出,简称 后进先出(LIFO),这就是典型的栈结构. 新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底. 在栈里,新元素都靠近栈顶,旧元素都接近栈底. 从栈的操作特性来看,是一种 操作受限的线性表,只允许在

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

什么是数据结构和算法

数据结构是相互之间存在的一种或多种特定关系的数据元素的集合. 通俗点就是数据的逻辑结构,比方说这些数据在内存中以什么样的结构存放. 通用数据结构:数组.链表.树.哈希表专用数据结构:栈.队列.优先级队列排序:插入排序.希尔排序.快速排序.归并排序.堆排序图:邻接矩阵.邻接表外部存储:顺序存储.索引文件.B-树.哈希方法 算法实际是编程过程中完成一件事采用的方法,比方说现实生活中做数学题时两个人都将题完成但是他们之间有一个用的时间很短就是因为采用了简便的方法.同样在编程过程中采用好的算法可以降低程

常用数据结构和算法操作效率的对比总结

前面介绍了经典的数据结构和算法,这一节我们对这些数据结构和算法做一个总结,具体细节,请参见各个章节的详细介绍,这里我们用表格来呈现它们的效率. 1. 数据结构部分 数据结构中常用的操作的效率表 通用数据结构 查找 插入 删除 遍历 数组 O(N) O(1) O(N) - 有序数组 O(logN) O(N) O(N) O(N) 链表 O(N) O(1) O(N) - 有序链表 O(N) O(N) O(N) O(N) 二叉树 O(logN) O(logN) O(logN) O(N) 二叉树(最坏)

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

STL模板类--数据结构与算法

STL提供了一些模板类,实现了<数据结构>中的一些数据结构类型 在写代码时用到栈,队列等数据结构时可以充分利用STL模板类,会发现特别好用. 想起C语言中用数组实现栈和队列,简直就是噩梦. C++是世界上最好的语言...(just kidding !!!) 顺序容器:动态数组vector;deque链表list; 关联容器:set/multiset有序值:map/multimap有序键值对 一. 动态数组vector类 1.定义:#include<vector>  std::vec