嗯,我想比较2个字符串(版本1和版本2),并获得格式的差异,我可以自己转换为html,就像你可以看到一个帖子是如何在这里编辑堆栈溢出或像svn跟踪版本之间的差异....
必须是完整的托管代码库。
就像这个JavaScript,但是我需要在服务器端做它。
Google也有类似的功能,并且可以在c#中使用,但还没有深入研究。这个演示看起来很酷。
http://code.google.com/p/google-diff-match-patch/我有一个这样做的类库,我将在下面发布一个链接,但我也会发布它是如何工作的,这样你就可以评估它是否适合你的内容。
请注意,对于我下面所说的所有内容,如果您将每个字符视为集合中的一个元素,则可以对任何类型的内容实现下面描述的算法。可以是字符串字符、文本行、orm对象集合。
整个算法围绕LCS (longest-common-substring)展开,是一种递归方法。
首先,算法试图找到两者之间的LCS。这将是两个版本之间最长的不变/相同的部分。然后算法认为这两个部分是"对齐的"。
例如,下面是如何对齐两个示例字符串:
This long text has some text in the middle that will be found by LCS
This extra long text has some text in the middle that should be found by LCS
^-------- longest common substring --------^
然后它递归地应用于对齐部分之前的部分,以及之后的部分。
最终的"result"可能看起来像这样(我使用下划线来表示其中一个字符串中的"not there"部分):
This ______long text has some text in the middle that ______will be found by LCS
This extra long text has some text in the middle that should____ be found by LCS
然后,作为递归方法的一部分,每一级递归调用将返回一个"操作"集合,该集合基于是否存在LCS,或者在其中任何一部分中缺少部分,将吐出如下内容:
- 如果是LCS,则是"复制"操作
- 如果从第一个缺失,那么它是一个"插入"操作
- 如果从秒中丢失,则为"删除"操作
所以上面的文本应该是:
- 复制5个字符(
This
) - 插入
extra_
(显然代码块在这里删除空格,下划线是一个空格) - 复制43个字符(
long text has some text in the middle that_
) - 插入
should
- 删除4个字符(
will
) - 复制16个字符(
_be found by LCS
)
算法的核心非常简单,有了上面的文本,如果你想的话,你应该可以自己实现它。
在我的类库中有一些额外的功能,特别是处理诸如与更改的文本相似的内容之类的东西,因此您不仅可以进行删除或插入操作,还可以进行修改操作,如果您正在比较一些东西的列表,例如文本文件中的行,这将非常重要。
类库可以在这里找到:GitHub上的DiffLib,你也可以在Nuget上找到它,以便于在Visual Studio 2010中安装。它是用c#为。net 3.5及更高版本编写的,所以它可以在。net 3.5和。net 4.0上运行,而且由于它是一个二进制版本(所有源代码都在GitHub上),你可以在VB中使用它。