Mike Park
Mike Park

Reputation: 10941

Visualizing differences in 2+ plain text strings

I'm looking for a good way to show differences between 2 or more texts (side by side). I don't need to be able to create a patch or anything like that--just show the differences line by line.

Are there any existing open-source C# libraries that do something like this? If not, is there a variation of a diff algorithm that works with more than 2 strings?

Upvotes: 1

Views: 434

Answers (1)

Ta01
Ta01

Reputation: 31610

Here are two implementations of the Levenshtein Distance algorithm in C#

Link 1 Link 2

The larger the result, the bigger the difference.

Edit: Copying code in case links go dead for future use

Example 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"));
    }
}

Example 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];

  }

Upvotes: 1

Related Questions