可视化2 +纯文本字符串中的差异

时间:2011-04-11 18:05:03

标签: c# diff

我正在寻找一种很好的方式来显示两个或更多文本之间的差异(并排)。我不需要能够创建补丁或类似的东西 - 只是逐行显示差异。

是否有任何现有的开源C#库可以执行此类操作?如果没有,是否有一个diff算法的变体可以使用2个以上的字符串?

1 个答案:

答案 0 :(得分:1)

以下是C#

Levenshtein Distance算法的两种实现

Link 1 Link 2

结果越大,差异越大。

修改:复制代码,以防万一链接丢失以备将来使用

示例1:

using System;

/// <summary>
/// Contains approximate string matching
/// </summary>
static class LevenshteinDistance
{
    /// <summary>
    /// Compute the distance between two strings.
    /// </summary>
    public static int Compute(string s, string t)
    {
    int n = s.Length;
    int m = t.Length;
    int[,] d = new int[n + 1, m + 1];

    // Step 1
    if (n == 0)
    {
        return m;
    }

    if (m == 0)
    {
        return n;
    }

    // Step 2
    for (int i = 0; i <= n; d[i, 0] = i++)
    {
    }

    for (int j = 0; j <= m; d[0, j] = j++)
    {
    }

    // Step 3
    for (int i = 1; i <= n; i++)
    {
        //Step 4
        for (int j = 1; j <= m; j++)
        {
        // Step 5
        int cost = (t[j - 1] == s[i - 1]) ? 0 : 1;

        // Step 6
        d[i, j] = Math.Min(
            Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
            d[i - 1, j - 1] + cost);
        }
    }
    // Step 7
    return d[n, m];
    }
}

class Program
{
    static void Main()
    {
    Console.WriteLine(LevenshteinDistance.Compute("aunt", "ant"));
    Console.WriteLine(LevenshteinDistance.Compute("Sam", "Samantha"));
    Console.WriteLine(LevenshteinDistance.Compute("flomax", "volmax"));
    }
}

示例2:

public class Distance {

/// <summary>
/// Compute Levenshtein distance
/// </summary>
/// <param name="s">String 1</param>
/// <param name="t">String 2</param>
/// <returns>Distance between the two strings.
/// The larger the number, the bigger the difference.
/// </returns>

  public int LD (string s, string t) {

  int n = s.Length; //length of s

  int m = t.Length; //length of t

  int[,] d = new int[n + 1, m + 1]; // matrix

  int cost; // cost

    // Step 1

    if(n == 0) return m;

    if(m == 0) return n;

    // Step 2

    for(int i = 0; i <= n; d[i, 0] = i++);

    for(int j = 0; j <= m; d[0, j] = j++);

    // Step 3

    for(int i = 1; i <= n;i++) {

      //Step 4

      for(int j = 1; j <= m;j++) {

        // Step 5

        cost = (t.Substring(j - 1, 1) == s.Substring(i - 1, 1) ? 0 : 1);

        // Step 6

        d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
                  d[i - 1, j - 1] + cost);

      }

    }


    // Step 7


    return d[n, m];

  }