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

  • 相关阅读:
    dropload.js 上滑加载,下拉刷新
    jQuery支持图片放大缩小查看效果
    iScroll-5 API 中文版
    多行文字垂直居中
    jQuery延迟加载(懒加载)插件 – jquery.lazyload.js
    js生成中文二维码
    JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??
    HTML5页面,用JS 禁止弹出手机键盘
    watch和computed的用法区别是什么?
    JS中的call()和apply()
  • 原文地址:https://www.cnblogs.com/y112102/p/2840682.html
Copyright © 2011-2022 走看看