Puede que esté interesado en echar un vistazo a la biblioteca google-diff-match-patch en Google Code. Tienen una implementación del algoritmo diff de Myer y afirma implementar también un algoritmo Bitap "en el corazón".
Tiene la fuente C# que está buscando, así como las implementaciones en Java, C++, Lua & Python. Aunque no tengo la mejor comprensión de cómo usar Bitap en la práctica (hay demos en el proyecto de Google Code), creo que estarás más interesado en las funciones de coincidencia que comienzan alrededor de la línea 1476 del current version.
ACTUALIZACIÓN:
Un poco de investigación encontró una implementación de Levenshtein in C# en CodeProject.
Además, this C# class file contiene una implementación de Levenshtein en SourceForge. La implementación es parte del proyecto Corsis (también conocido como Tenka Text). El autor afirma que el método YetiLevenshtein (alrededor de la línea 741) es de 2 veces a 10 veces más rápido que la implementación utilizada en la versión CodeProject del algoritmo mencionado anteriormente.
ACTUALIZACIÓN # 2:
acabo de descubrir el wikilibro Algorithm implementation con ella es C# versión de Levenshtein Distancia y tuvo que incluirlo porque se ve bastante simple y al punto. Este wikibook parece una gran referencia para tener a mano en general.
Levenshtein Distance in C# (cortesía de Wikilibros)
private Int32 levenshtein(String a, String b)
{
if (string.IsNullOrEmpty(a))
{
if (!string.IsNullOrEmpty(b))
{
return b.Length;
}
return 0;
}
if (string.IsNullOrEmpty(b))
{
if (!string.IsNullOrEmpty(a))
{
return a.Length;
}
return 0;
}
Int32 cost;
Int32[,] d = new int[a.Length + 1, b.Length + 1];
Int32 min1;
Int32 min2;
Int32 min3;
for (Int32 i = 0; i <= d.GetUpperBound(0); i += 1)
{
d[i, 0] = i;
}
for (Int32 i = 0; i <= d.GetUpperBound(1); i += 1)
{
d[0, i] = i;
}
for (Int32 i = 1; i <= d.GetUpperBound(0); i += 1)
{
for (Int32 j = 1; j <= d.GetUpperBound(1); j += 1)
{
cost = Convert.ToInt32(!(a[i-1] == b[j - 1]));
min1 = d[i - 1, j] + 1;
min2 = d[i, j - 1] + 1;
min3 = d[i - 1, j - 1] + cost;
d[i, j] = Math.Min(Math.Min(min1, min2), min3);
}
}
return d[d.GetUpperBound(0), d.GetUpperBound(1)];
}
Sí, eso es un buen comienzo, esta lib contiene muchos códigos útiles. –
Teniendo en cuenta que esta biblioteca es utilizada por Google Docs (de acuerdo con la página de inicio del proyecto), es probable que sea lo suficientemente buena para las necesidades de coincidencia de cadenas. –
¿Sabes qué más sería una lectura interesante? El código fuente de la característica diff utilizada en SO (Ejemplo: http://stackoverflow.com/posts/4508581/revisions) –