7

2つの文字列(バージョン1とバージョン2)を比較して、自分でhtmlに変換できる形式で違いを取得したいと思います。たとえば、スタックオーバーフローで投稿がどのように編集されたかを確認したり、svnがリビジョン...

フルマネージコードライブラリである必要があります。

このJavaScriptと同様ですが、サーバー側で実行する必要があります。

4

2 に答える 2

9

Google には似たようなものがあり、C# で利用できますが、詳しく調べていません。デモはかなりクールに見えます。

http://code.google.com/p/google-diff-match-patch/

于 2011-07-18T11:30:40.360 に答える
6

私はこれを行うクラス ライブラリを持っています。以下にリンクを投稿しますが、コンテンツに適しているかどうかを評価できるように、それがどのように機能するかについても投稿します。

以下で説明するすべてのことについて、各キャラクターをコレクションの要素と考えれば、以下に説明するアルゴリズムをあらゆるタイプのコンテンツに実装できることに注意してください。文字列の文字、テキスト行、ORM オブジェクトのコレクションなどです。

アルゴリズム全体は、最長共通部分文字列(LCS) を中心に展開し、再帰的なアプローチです。

最初に、アルゴリズムは 2 つの間の LCS を見つけようとします。これは、2 つのバージョン間で変更されていない/同一である最長のセクションになります。次に、アルゴリズムは、これら 2 つの部分が「整列」していると見なします。

たとえば、次のように 2 つの例の文字列が整列されます。

      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 --------^

次に、整列されたセクションの前の部分とその後の部分に再帰的に適用されます。

最終的な「結果」は次のようになります (文字列の 1 つに「存在しない」部分を示すためにアンダースコアを使用しています)。

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の場合、それは「コピー」操作です
  • 最初から欠落している場合、それは「挿入」操作です
  • 秒から欠落している場合、それは「削除」操作です

したがって、上記のテキストは次のようになります。

  1. 5文字コピー(This
  2. 挿入extra_(どうやらここのコード ブロックはスペースを削除します。アンダースコアはスペースです)
  3. 43文字コピー(long text has some text in the middle that_
  4. 入れるshould
  5. 4文字削除(will
  6. 16文字コピー(_be found by LCS

アルゴリズムのコアは非常にシンプルで、上記のテキストを使用して、必要に応じて自分で実装できるはずです。

私のクラス ライブラリにはいくつかの追加機能があります。特に、変更されたテキストにたコンテンツなどを処理するため、削除または挿入操作だけでなく変更操作も取得できます。これは、次の場合に最も重要になります。テキストファイルの行など、何かのリストを比較しています。

クラス ライブラリは、GitHubの DiffLib にあります。Visual Studio 2010 に簡単にインストールできるように、Nuget にもあります。.NET 3.5 以降用に C# で記述されているため、.NET 3.5 および 4.0 で動作します。 、バイナリ リリースなので (すべてのソース コードは GitHub にあります)、VB.NET からも使用できます。

于 2011-07-18T11:25:05.497 に答える