测试.net开源文本差异对比组件DiffPlex的基本用法
基于参考文献,学习并测试.net开源文本差异对比组件DiffPlex的基本用法
微信公众号“Dotnet 工具箱”看到一篇《.NET 的开源文本差异对比组件》的文档,主要介绍开源组件DiffPlex。DiffPlex是C#编写的通用文本差异比较库,目前支持.net framework3.5、.net framework4.0、.net6等运行时,DiffPlex支持在Winfrom、Wpf等项目下使用,如下图所示。本文基于参考文献1-2中的示例程序,在windorm下测试DiffPlex的基本用法。
创建Winform项目,通过NuGet包管理器安装DiffPlex组件,如下图所示:
参考文献1中主要调用DiffPlex.DiffBuilder命名空间下的InlineDiffBuilder.Diff函数逐行比较两个文本之间的差异,Diff函数的声明如下:
public static DiffPaneModel Diff(string oldText, string newText, bool ignoreWhiteSpace = true, bool ignoreCase = false, IChunker chunker = null)
Diff函数返回DiffPaneModel类的对象实例,该类的声明如下所示,主要参数是HasDifferences 和Lines,前者指明两个字符串是否有差异,如果有的话,则通过分析Lines属性获取具体差异信息,Lines属性中的每一条记录代表两个字符串中对应行的变化情况。
public class DiffPaneModel
{
public List<DiffPiece> Lines { get; }
public bool HasDifferences => Lines.Any((DiffPiece x) => x.Type != ChangeType.Unchanged);
public DiffPaneModel()
{
Lines = new List<DiffPiece>();
}
}
DiffPaneModel的Lines属性是DiffPiece 类型集合,DiffPiece 类的声明如下,其中ChangeType标明本行的状态,包括未变更、新增、删除等,其中状态为未变更和新增时Positon属性会记录行号。根据个人理解,未变更表明两个文件中指定行内容没有变化,新增表明新字符串中指定行内容是新增的内容,而删除则表明新字符串中没有旧字符串中对应行的内容。ChangeType枚举值有5类值,但测试过程中只看到了Unchanged、Deleted、Inserted三种状态,其余两种状态不清楚具体意义。下面的调试截图是测试过程中截取的Lines属性值示意图。
public class DiffPiece : IEquatable<DiffPiece>
{
public ChangeType Type { get; set; }
public int? Position { get; set; }
public string Text { get; set; }
public List<DiffPiece> SubPieces { get; set; } = new List<DiffPiece>();
...
...
}
public enum ChangeType
{
Unchanged,
Deleted,
Inserted,
Imaginary,
Modified
}
采用了两组数据进行测试,第一组是参考文献1中的例子,稍微调整了一下,然后运行测试程序,可以看到程序返回的结果,基本上把文件2中哪些是新增的、哪些是文件1中存在但文件2中没有的说得比较清楚。
第二组测试数据之前编写的测试Python的poplib和imaplib模块连接邮箱的测试程序,这这个文件差异比较大,不过DiffPlex也能逐行的标识出变化情况,如下图所示:
测试程序写的比较简陋,只是初步基于参考文献学习了DiffPlex的基本用法,后续还会继续深入学习。
参考文献
[1]https://blog.csdn.net/sd7o95o/article/details/127563464
[2]https://github.com/mmanela/diffplex
更多推荐
所有评论(0)