using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FuzzyString { public static partial class ComparisonMetrics { public static double JaroDistance(this string source, string target) { int m = source.Intersect(target).Count(); if (m == 0) { return 0; } else { string sourceTargetIntersetAsString = ""; string targetSourceIntersetAsString = ""; IEnumerable sourceIntersectTarget = source.Intersect(target); IEnumerable targetIntersectSource = target.Intersect(source); foreach (char character in sourceIntersectTarget) { sourceTargetIntersetAsString += character; } foreach (char character in targetIntersectSource) { targetSourceIntersetAsString += character; } double t = sourceTargetIntersetAsString.LevenshteinDistance(targetSourceIntersetAsString) / 2; return ((m / source.Length) + (m / target.Length) + ((m - t) / m)) / 3; } } } }