微信公众号“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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐