2012-04-26 45 views
11

2つの単純な文字列を比較する簡単で軽量なアルゴリズムを探しています。我々は、これら二つの文字列取る場合たとえば、単純な単語差分アルゴリズム

  • を「速い茶色のキツネは、のろまなイヌに飛びかかった」
  • 「クレイジー犬オーバーplick茶色のキツネのtumps」

2番目の単語の2文字目の最初の文字が異なっていることを私に知らせてください。

今のところ私は単語を比較する非常に簡単なアルゴリズムを持っています:

/// <summary> 
    /// Make a diff between two strings and returns words indices 
    /// </summary> 
    /// <param name="a"></param> 
    /// <param name="b"></param> 
    /// <returns></returns> 
    public static List<int> Diff(string a, string b) 
    { 
     List<int> indices = new List<int>(); 

     string[] asplit = a.Split(' '); 
     string[] bsplit = b.Split(' '); 

     for (int i = 0; i < asplit.Length; i++) 
     { 
      if (bsplit.Length > i) 
      { 
       if (asplit[i].CompareTo(bsplit[i]) != 0) 
       { 
        indices.Add(i); 
       } 
      } 
     } 

     return indices; 
    } 

これは、空白文字の区切りを使ってどの単語が異なるか教えてくれます。

複雑なアルゴリズムの実装や既存のライブラリの使用について、ここでは多くのトピックを読んでいます。

しかし、私は.NETコンパクトフレームワーク(WP7)で再トレーニングしていますが、2つのファイルまたは2つのテキストを比較できるものはありません。単語の比較が必要です。

適合するライブラリまたはアルゴリズムはありますか? ありがとうございました。

+1

文の途中に単語が挿入されていて、それでその単語が歪んだ場合はどうなりますか?その後のすべての単語が違うと報告すべきか? –

+9

この問題を解決する標準的な方法は、最長共通部分列アルゴリズムを実装することです。これはかなり簡単なアルゴリズムです。私はここにJScriptの実装があります:http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspxをC#に変換することは、練習問題として残されています。 –

+0

@James Michael Hare:「私の小さなポニー」と「私の甘い小さなポニー」があるとしましょう。私はあまりに単純なアルゴリズムがこれに失敗すると思います。 – Valryon

答えて

3

DiffPlexプロジェクトをご覧ください。

コア機能は\ DiffPlex \ Differ.csのように見えます。Silverlightビューアもありますが、移植が必要な場合があります。

編集:

私はDiffPlexは特に、あなたの質問ごとにワードの比較をサポートしていることを追加したいです。他の文字や行などの比較メソッドの中に埋もれていることは明らかではないかもしれません。

+0

これは本当にうれしいようですが、私はコアだけを統合して、それが私の小さな要件ではあまりないかどうかを見ていきます。 ありがとう! – Valryon

+0

本当にうまくいって、もう一度感謝します。 diffコアは実際に軽くて強力で、わかりやすいインターフェースを備えています。 追加の例(UnidiffSeqFormater、http://diffplex.codeplex.com/discussions/254392)を使用して、数行で複雑なchar diffを実行することができました。 – Valryon