【问题标题】:How to display word differences using c#?如何使用 c# 显示单词差异?
【发布时间】:2010-12-28 09:30:19
【问题描述】:

我想显示两个文本块之间的差异。而不是比较文本行或单个字符,我只想比较由指定字符分隔的单词(例如'\n'、''、'\t')。我这样做的主要原因是,我将要比较的文本块通常没有很多换行符,而且字母比较很难理解。

我遇到过以下O(ND) logic in C# 用于比较行和字符,但我有点不知如何修改它来比较单词。

此外,我想跟踪单词之间的分隔符并确保它们包含在差异中。因此,如果一个空格被硬返回所取代,我希望它作为一个差异出现。

我正在使用 Asp.Net (c#) 显示整个文本块,包括已删除的原始文本和添加的新文本(两者都将突出显示以表明它们已被删除/添加)。一个适用于这些技术的解决方案将不胜感激。

感谢任何有关如何完成此操作的建议。

【问题讨论】:

  • 玩得开心。我的一位同事为了发布我们的旗舰产品线而必须这样做。他受到了足够的挑战。他使用了几篇理论论文来指导他的工作……一直在抱怨写作的质量。

标签: c# diff word-diff


【解决方案1】:

Microsoft 已在 CodePlex 上发布了一个差异项目,允许您进行单词、字符和行差异。它是根据 Microsoft 公共许可证 (Ms-PL) 获得许可的。

https://github.com/mmanela/diffplex

【讨论】:

  • DiffPlex 允许您定义一个自定义函数,用于在区分文本之前如何对文本进行分区。您可以使用以下方法: DiffResult CreateCustomDiffs(string oldText, string newText, bool ignoreWhiteSpace, Func chunker) 其中 chunker 告诉 DiffPlex 要相互比较的原子单元是什么。
  • 嗨,Jim,我正在寻找类似的解决方案,如果使用 diffplex 解决了您的问题,想知道您的看法吗?
  • 看起来我使用了codeproject.com/Articles/11454/… 作为我的解决方案。我不记得为什么我在 diffplex 上使用它,tbh。此解决方案将已删除和添加的单词包装在定义的 html 标记中,允许您根据需要设置样式。
【解决方案2】:

除了一些一般性的优化之外,如果您需要在比较中包含分隔符,那么您实际上是在逐个字符地进行中断比较。尽管您可以使用链接的 O(ND),但您将对它进行尽可能多的更改,就像您基本上编写自己的一样。

差异比较的主要问题是找到延续(如果我删除了一个单词,但其余的保持不变)。

如果你想用他们的代码以例子开头,不写删除的字符,如果在同一个地方有替换的字符,不要输出这个结果。然后,您需要计算“已更改”单词的最长连续运行,突出显示该字符串并输出。

抱歉,答案不多,但对于这个问题,答案基本上是编写和调整函数。

【讨论】:

    【解决方案3】:

    String.Split 使用 '\n'、' ' 和 '\t' 作为拆分字符将在您的文本块中返回一个单词数组。

    然后您可以比较每个数组的差异。一个简单的 1:1 比较会告诉您是否有任何单词被更改。比较:

    hello world how are you
    

    和:

    hello there how are you
    

    会给你world 并改为there

    它不会告诉您的是是否插入或删除了单词,您仍然需要逐个字符地解析文本块以查看是否有任何分隔符已更改。

    【讨论】:

    • 我担心大块文本的String.Split会效率低下。
    【解决方案4】:

    string string1 = "你好,你好吗"; string string2 = "你好,你好吗";

            var first = string1.Split(' ');
            var second = string2.Split(' ');
            var primary = first.Length > second.Length ? first : second;
            var secondary = primary == second ? first : second;
            var difference = primary.Except(secondary).ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多