借鉴一下对比算法


1         /// <summary>
/// 比较两个DataTable数据(结构相同,字段名不同)
/// </summary>
/// <param name="dtDest">来自数据库的DataTable</param>
/// <param name="dtSrc">来自文件的DataTable</param>
/// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
/// <param name="dtRetDel">删除的数据(dt2中的数据)</param>
/// <param name="srcKeyFields">源关键字段名</param>
/// <param name="destKeyFields">目标关键字段名,与源关键字段名对应</param>
public static void CompareDt(DataTable dtSrc, DataTable dtDest, out DataTable dtRetAdd, out DataTable dtRetDel, string srcKeyFields, string destKeyFields)
{
//源记录集与目标记录集有一个为null则退出
if (dtSrc == null || dtDest == null)
{
dtRetDel = null;
dtRetAdd = null;
return;
}
//定义返回记录表
dtRetDel = dtSrc.Clone();
dtRetAdd = dtRetDel.Clone();
//参照列为空则退出
if (string.IsNullOrEmpty(srcKeyFields) || string.IsNullOrEmpty(destKeyFields))
return;
//获得参照列列表
string[] srcFields = srcKeyFields.Split(‘,‘);//列名数组
string[] destFields = destKeyFields.Split(‘,‘);//列名数组
//参照列数目不一致则退出
if (srcFields.Length != destFields.Length)
return;
//按参照列排序源表和目标表
DataRow[] drSrc = dtSrc.Select("", srcKeyFields);
DataRow[] drDest = dtDest.Select("", destKeyFields);
//定义源表和目标表长度
int iSrcCount = drSrc.Length;
int iDestCount = drDest.Length;
//源表为空则目标表全部加入删除队列并返回
if (iSrcCount == 0)
{
foreach (DataRow row in drDest)
{
dtRetDel.Rows.Add(row.ItemArray);
}
return;
}
//目标表为空则源表全部加入新增队列并返回
if (iDestCount == 0)
{
foreach (DataRow row in drSrc)
{
dtRetAdd.Rows.Add(row.ItemArray);
}
return;
}
//定义源表和目标表指针
int iSrc = 0;
int iDest = 0;
//开始循环比对
while (iSrc < iSrcCount && iDest < iDestCount)
{
//定义列比对结果
int result = 0;
object oSrc;
object oDest;
//循环比对列值
for (int colIndex = 0; colIndex < srcFields.Length; colIndex++)
{
//获得列值
oSrc = drSrc[iSrc][srcFields[colIndex]];
oDest = drDest[iDest][destFields[colIndex]];
//比较列值,不相等则退出循环
if (oSrc == DBNull.Value)
{
result = oDest == DBNull.Value ? 0 : -1;
}
else
{
result = oDest == DBNull.Value ? 1 : string.Compare(oSrc.ToString(), oDest.ToString(), false);
}
if (result != 0)
break;
}
//检查行比较结果
switch (result)
{
////源表小则将源表本行加入新增队列,同时移动源表指针
case -1:
dtRetAdd.Rows.Add(drSrc[iSrc].ItemArray);
iSrc++;
break;
////相同两表同时移动指针
case 0:
iSrc++;
iDest++;
break;
////目标表小则将目标表本行加入删除队列,同时移动目标表指针
case 1:
dtRetDel.Rows.Add(drDest[iDest].ItemArray);
iDest++;
break;
default:
break;
}
}
//源表到达最后一条,目标表未到达,则目标表剩余行全部加入删除队列
if (iDest < iDestCount)
{
for (int index = iDest; index < iDestCount; index++)
{
dtRetDel.Rows.Add(drDest[index].ItemArray);
}
}
//目标表到达最后一条,源表未到达,则源表剩余行全部加入新增队列
else if (iSrc < iSrcCount)
{
for (int index = iSrc; index < iSrcCount; index++)
{
dtRetAdd.Rows.Add(drSrc[index].ItemArray);
}
}
121

对比算法,借鉴一下。


       static void Main(string[] args)
{
DataTable dt1 = new DataTable();
dt1.Columns.Add("a", System.Type.GetType("System.String"));
DataRow dr = dt1.NewRow();
dr["a"] = "1";
DataRow dr1 = dt1.NewRow();
dr1["a"] = "2";
dt1.Rows.Add(dr1);
DataRow dr2 = dt1.NewRow();
dr2["a"] = "7";
dt1.Rows.Add(dr2);
DataRow dr3 = dt1.NewRow();
dr3["a"] = "8";
dt1.Rows.Add(dr3);
DataRow dr4 = dt1.NewRow();
dr4["a"] = "9";
dt1.Rows.Add(dr4);

DataTable dt2=new DataTable ();
dt2.Columns.Add("b", System.Type.GetType("System.String"));
DataRow dr5 = dt2.NewRow();
dr5["b"] = "1";
dt2.Rows.InsertAt(dr5, 0);
DataRow dr6 = dt2.NewRow();
dr6["b"] = "3";
dt2.Rows.InsertAt(dr6, 0);
DataRow dr7 = dt2.NewRow();
dr7["b"] = "4";
dt2.Rows.InsertAt(dr7, 0);
DataRow dr8 = dt2.NewRow();
dr8["b"] = "5";
dt2.Rows.InsertAt(dr8, 0);
DataRow dr9 = dt2.NewRow();
dr9["b"] = "6";
dt2.Rows.InsertAt(dr9, 0);
DataTable dt3=new DataTable ();
DataTable dt4=new DataTable ();
CompareDt(dt1,dt2,out dt3,out dt4,"a","b");
}

借鉴一下对比算法

时间: 2024-10-10 07:55:46

借鉴一下对比算法的相关文章

图片对比 算法性能对比

■环境 Win 7 SP1 (Win 32) 4G Memory Intel Core i3-3120M 2.5GHz Python 3.6.0 Pycharm 2017.1.3 PIL 1.1.7 Pillow 3.4.2 Numpy 1.14.2 (cp36) OpenCV 3.4.1 (cp36) ■图片目录结果 C:. │ ├─1 │ └─Car │ BenZ-01.jpg │ BenZ-02.jpg │ BenZ-03.jpg │ BMW-01.jpg │ BMW-02.jpg │ B

【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨

引文 我有个朋友有算法强迫症,每次一看到别人写的算法,就有上去改的冲动,不然就会偏头疼,主要症结在于他认为别人写的算法不好,但是什么的算法可以评判为好,什么样的算法可以评判为不好?最近为了治愈他,我特地写了这篇文章. 算法的衡量从两个方向出发:时间复杂度和空间复杂度.本文主要是不讲具体算法,只将算法的衡量,重点讲解如何衡量算法的复杂度,解决平时见到的XX算法时间复杂是O(logn)O(logn),其中这个结果是怎么推导出来的?lognlogn是个什么玩意儿?,大写的OO是什么意思?为什么用这个符

Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现

LPA算法的思路: 首先每个节点有一个自己特有的标签,节点会选择自己邻居中出现次数最多的标签,如果每个标签出现次数一样多,那么就随机选择一个标签替换自己原始的标签,如此往复,直到每个节点标签不再发生变化,那么持有相同标签的节点就归为一个社区. 算法优点:思路简单,时间复杂度低,适合大型复杂网络. 算法缺点:众所周知,划分结果不稳定,随机性强是这个算法致命的缺点. 体现在:(1)更新顺序.节点标签更新顺序随机,但是很明显,越重要的节点越早更新会加速收敛过程 (2)随机选择.如果一个节点的出现次数最

基于请求的分布式互斥算法

一个悲剧的文章,研究的东西确实比较老,但是因为这些研究,让我对分布式的底层的关系有了更加清晰的认识,也算是不枉此功. 下面贴出来核心的部分. 引言 分布式系统中的一组进程可能会同时访问一个资源或者同时执行一个给定的函数,我们称这些资源或者函数为临界区(Critical Section),若不加控制的话,会造成资源或者环境的不一致的现象.保证任何给定时刻只允许一个进程或者给定的进程去执行临界区的算法称为互斥算法.互斥也可以称为并发控制. 这个问题最早由Dijkstra[1]在1965年提出.互斥可

Virtual DOM 算法

前端 virtual-dom react.js javascript 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步骤一:用JS对象模拟DOM树 4.2 步骤二:比较两棵虚拟DOM树的差异 4.3 步骤三:把差异应用到真正的DOM树上 5 结语 6 References 1 前言 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚.希望在阅读本

算法复杂度分析方法以及算法概述

算法定义:解决特定问题的求解步骤的描述. 算法特性:有穷性.确定性.可行性.输入.输出 算法的设计要求:正确性.可读性.健壮性.高效率和低存储量需求 算法度量方法:事后统计方法(不科学).事前分析估算方法 函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近快于g(n). 于是,可以得出结论:判定一个算法好不好,可以对比算法的关键执行次数函数的渐近增长性,基本就可以分析出:某一个算法,随着n的变大,它会越

实现一个 Virtual DOM 算法

1 前言 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚.希望在阅读本文后,能让你深入理解 Virtual DOM 算法,给你现有前端的编程提供一些新的思考. 本文所实现的完整代码存放在 Github. 2 对前端应用状态管理的思考 假如现在你需要写一个像下面一样的表格的应用程序,这个表格可以根据不同的字段进行升序或者降序的展示. 这个应用程序看起来很简单,你可以想出好几种不同的方式来写.最容易想

c排序算法大全

排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高. 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示.在后面将给出详细的说明.<计算机程序设计技巧>(第三卷,排序和查找)     对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲. 我将按照算法的复杂度,从简单到难来分析算法.第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标).第二部分是高

Struck跟踪算法(一)

Struck跟踪算法:Structed Output Tracking with Kernels   (ICCV /2011年) 原理:  Adaptive tracking-by-detection methods 最近做项目,需要借鉴一下这个算法,于是就打算好好学习这个算法. 算法下载地址:http://download.csdn.net/detail/sunboyiris/7681943 首先介绍一下如何调通这个算法,首先要引入两个库:Eigen库和OpenCV库 Eigen库配置: Ei