说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了。