Net DataTable(扩展到obj)比较相等

说datatabel有点狭义 可以是任意的类型 

代码:

 1         static void Main(string[] args)
 2         {
 3             //模拟数据
 4             DataTable dt = new DataTable();
 5             DataColumn dc = new DataColumn("id");
 6             DataColumn name = new DataColumn("name");
 7             dt.Columns.Add(dc);
 8             dt.Columns.Add(name);
 9             DataRow dr = dt.NewRow();
10             dr["id"] = "t_sp";
11             DataRow dr1 = dt.NewRow();
12             dr1["id"] = "t_sp";
13             dt.Rows.Add(dr);
14             dt.Rows.Add(dr1);
15 
16             //为了方便复制了一个datatabel 不过你也可以手动创建
17             DataTable dt_extend = dt.Copy();
18             dt_extend.Rows[1][0] = "tsp";
19             Console.WriteLine(ValueEquals(dt, dt_extend));
20         }
21         public static bool ValueEquals(DataTable objA, DataTable objB)
22         {
23             string mdA, mdB;
24             mdA = toMD5(objA);
25             mdB = toMD5(objB);
26             if (mdA.Equals(mdB))
27                 return true;
28             else
29                 return false;
30         }
31 
32         /// <summary>
33         /// 实现原理和思路
34         /// 序列化DataTable后取哈希值
35         /// 什么是序列化和反序列化(由于写js脚本习惯的问题 就引用了js的解析 不过思路都一样)
36         /// 序列化就把对象变成字符串 反序列化就是把字符串还原成对象(至于为什么个人见解是存储需要以及传送方便。最常见的就是json)
37         /// 此方法确定 只能比较一列至于为什么 还希望园友们指教 
38         /// </summary>
39         /// <param name="ds"></param>
40         /// <returns></returns>
41         public static string toMD5(DataTable ds)
42         {
43             string reMD5 = "";
44             using (MemoryStream memStream = new MemoryStream())
45             {
46                 IFormatter brFormatter = new BinaryFormatter();
47                 ds.RemotingFormat = SerializationFormat.Binary;
48                 brFormatter.Serialize(memStream, ds);
49                 Byte[] dataToHash = memStream.ToArray();
50                 using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
51                 {
52                     Byte[] hashvalue = md5.ComputeHash(dataToHash);
53                     reMD5 = Convert.ToBase64String(hashvalue);
54                 }
55             }
56             return reMD5;
57         }

图:

修改成一样的值

总结:提供一种思路 换个思维学习。可能有人只能比较一列 我有很多怎么办呢? 相信看过微软的数据库缓存就知道他的方案 (额外加一列(值为0和1)作为标识)

假如修改就修改对应的o和1 最后根据0和1来判断 这样就不用满世界去for了。

原文地址:https://www.cnblogs.com/y112102/p/2840682.html