2011-04-11 4 views
1

2 개 이상의 텍스트 간의 차이점을 (나란히) 표시하는 좋은 방법을 찾고 있습니다. 차이점을 한 줄씩 보여 주기만하면 패치 나 그와 비슷한 것을 만들 필요가 없습니다.2+ 일반 텍스트 문자열의 차이 시각화

이와 비슷한 기능을하는 기존의 오픈 소스 C# 라이브러리가 있습니까? 그렇지 않다면 2 개 이상의 문자열에서 작동하는 diff 알고리즘의 변형이 있습니까?

답변

1

여기서 C 번호

Link 1 Link 2

결과가 클수록, 큰 차이에 Levenshtein Distance 알고리즘의 두 가지 구현된다.

편집는 : 경우 링크에 복사 코드는 향후 사용을

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

    } 
+0

이 경우에만 작동합니다. 그렇지 않니? – climbage

+0

예. 그러나 그것은 아주 쉽게 수정할 수 있습니다. 무엇을 비교하고 싶습니까? 문장? 여전히 문장을 비교할 수 있습니다. – kd7

+0

예, 따라서 두 개의 문자열을 전달해야하는 메서드의 서명. –