zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    万恶的"unrecognized selector sent to instance"颤抖吧
    QT 中 QGLWidget 不能够嵌入到 QGraphicsView 中及解决方案
    程序代码里的幽默精神
    objectivec 中如何使用 c++?
    基于FPGA的跨时钟域信号处理——同步设计的重要
    亚稳态
    行为级和RTL级的区别
    FPGA同步复位,异步复位以及异步复位同步释放实例分析
    基于FPGA的跨时钟域信号处理——专用握手信号
    FPGA中亚稳态——让你无处可逃
  • 原文地址:https://www.cnblogs.com/y112102/p/2840682.html
Copyright © 2011-2022 走看看