diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d489a1d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +root=true + +[*.cs] +indent_size=4 +indent_style=space \ No newline at end of file diff --git a/FuzzyString.sln b/FuzzyString.sln index 10c46cf..1219469 100644 --- a/FuzzyString.sln +++ b/FuzzyString.sln @@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .gitattributes = .gitattributes .gitignore = .gitignore README.md = README.md + .editorconfig = .editorconfig EndProjectSection EndProject Global diff --git a/FuzzyString/ApproximatelyEquals.cs b/FuzzyString/ApproximatelyEquals.cs index 5565afd..8d1252f 100644 --- a/FuzzyString/ApproximatelyEquals.cs +++ b/FuzzyString/ApproximatelyEquals.cs @@ -1,25 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics - { - public static bool ApproximatelyEquals(this string source, string target, FuzzyStringComparisonTolerance tolerance, params FuzzyStringComparisonOptions[] options) + { + public static bool ApproximatelyEquals(this string source, string target, FuzzyStringComparisonTolerance tolerance, + FuzzyStringComparisonOptions options) { - List comparisonResults = new List(); + var comparisonResults = new List(); - if (!options.Contains(FuzzyStringComparisonOptions.CaseSensitive)) + if (!options.HasFlag(FuzzyStringComparisonOptions.CaseSensitive)) { - source = source.Capitalize(); - target = target.Capitalize(); + source = source.ToLower(); + target = target.ToLower(); } // Min: 0 Max: source.Length = target.Length - if (options.Contains(FuzzyStringComparisonOptions.UseHammingDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseHammingDistance)) { if (source.Length == target.Length) { @@ -28,58 +27,63 @@ public static bool ApproximatelyEquals(this string source, string target, Fuzzy } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseJaccardDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseJaccardDistance)) { comparisonResults.Add(source.JaccardDistance(target)); } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseJaroDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroDistance)) { comparisonResults.Add(source.JaroDistance(target)); } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseJaroWinklerDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroWinklerDistance)) { comparisonResults.Add(source.JaroWinklerDistance(target)); } // Min: 0 Max: LevenshteinDistanceUpperBounds - LevenshteinDistanceLowerBounds // Min: LevenshteinDistanceLowerBounds Max: LevenshteinDistanceUpperBounds - if (options.Contains(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance)) { - comparisonResults.Add(Convert.ToDouble(source.NormalizedLevenshteinDistance(target)) / Convert.ToDouble((Math.Max(source.Length, target.Length) - source.LevenshteinDistanceLowerBounds(target)))); + comparisonResults.Add(Convert.ToSingle(source.NormalizedLevenshteinDistance(target)) / + Convert.ToSingle(Math.Max(source.Length, target.Length) - + source.LevenshteinDistanceLowerBounds(target))); } - else if (options.Contains(FuzzyStringComparisonOptions.UseLevenshteinDistance)) + else if (options.HasFlag(FuzzyStringComparisonOptions.UseLevenshteinDistance)) { - comparisonResults.Add(Convert.ToDouble(source.LevenshteinDistance(target)) / Convert.ToDouble(source.LevenshteinDistanceUpperBounds(target))); + comparisonResults.Add(Convert.ToSingle(source.LevenshteinDistance(target)) / + Convert.ToSingle(source.LevenshteinDistanceUpperBounds(target))); } - if (options.Contains(FuzzyStringComparisonOptions.UseLongestCommonSubsequence)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubsequence)) { - comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubsequence(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length)))); + comparisonResults.Add(1 - Convert.ToSingle(source.LongestCommonSubsequence(target).Length / + Convert.ToDouble(Math.Min(source.Length, target.Length)))); } - if (options.Contains(FuzzyStringComparisonOptions.UseLongestCommonSubstring)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubstring)) { - comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubstring(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length)))); + comparisonResults.Add(1 - Convert.ToSingle(source.LongestCommonSubstring(target).Length / + Convert.ToSingle(Math.Min(source.Length, target.Length)))); } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseSorensenDiceDistance)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseSorensenDiceDistance)) { comparisonResults.Add(source.SorensenDiceDistance(target)); } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseOverlapCoefficient)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseOverlapCoefficient)) { comparisonResults.Add(1 - source.OverlapCoefficient(target)); } // Min: 0 Max: 1 - if (options.Contains(FuzzyStringComparisonOptions.UseRatcliffObershelpSimilarity)) + if (options.HasFlag(FuzzyStringComparisonOptions.UseRatcliffObershelpSimilarity)) { comparisonResults.Add(1 - source.RatcliffObershelpSimilarity(target)); } @@ -89,54 +93,19 @@ public static bool ApproximatelyEquals(this string source, string target, Fuzzy return false; } - if (tolerance == FuzzyStringComparisonTolerance.Strong) - { - if (comparisonResults.Average() < 0.25) - { - return true; - } - else - { + switch (tolerance) + { + case FuzzyStringComparisonTolerance.Strong: + return comparisonResults.Average() < 0.25; + case FuzzyStringComparisonTolerance.Normal: + return comparisonResults.Average() < 0.5; + case FuzzyStringComparisonTolerance.Weak: + return comparisonResults.Average() < 0.75; + case FuzzyStringComparisonTolerance.Manual: + return comparisonResults.Average() > 0.6; + default: return false; - } - } - else if (tolerance == FuzzyStringComparisonTolerance.Normal) - { - if (comparisonResults.Average() < 0.5) - { - return true; - } - else - { - return false; - } - } - else if (tolerance == FuzzyStringComparisonTolerance.Weak) - { - if (comparisonResults.Average() < 0.75) - { - return true; - } - else - { - return false; - } - } - else if (tolerance == FuzzyStringComparisonTolerance.Manual) - { - if (comparisonResults.Average() > 0.6) - { - return true; - } - else - { - return false; - } - } - else - { - return false; } } } -} +} \ No newline at end of file diff --git a/FuzzyString/FuzzyStringComparisonOptions.cs b/FuzzyString/FuzzyStringComparisonOptions.cs index b79dee5..9947f23 100644 --- a/FuzzyString/FuzzyStringComparisonOptions.cs +++ b/FuzzyString/FuzzyStringComparisonOptions.cs @@ -1,37 +1,34 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { + [Flags] public enum FuzzyStringComparisonOptions { - UseHammingDistance, + CaseSensitive = 0x0001, - UseJaccardDistance, + UseHammingDistance = 0x0002, - UseJaroDistance, + UseJaccardDistance = 0x0004, - UseJaroWinklerDistance, + UseJaroDistance = 0x0008, - UseLevenshteinDistance, + UseJaroWinklerDistance = 0x0010, - UseLongestCommonSubsequence, + UseLevenshteinDistance = 0x0020, - UseLongestCommonSubstring, + UseLongestCommonSubsequence = 0x0040, - UseNormalizedLevenshteinDistance, + UseLongestCommonSubstring = 0x0080, - UseOverlapCoefficient, + UseNormalizedLevenshteinDistance = 0x0100, - UseRatcliffObershelpSimilarity, + UseOverlapCoefficient = 0x0200, - UseSorensenDiceDistance, + UseRatcliffObershelpSimilarity = 0x0400, - UseTanimotoCoefficient, + UseSorensenDiceDistance = 0x0800, - CaseSensitive + UseTanimotoCoefficient = 0x1000, } } diff --git a/FuzzyString/FuzzyStringComparisonTolerance.cs b/FuzzyString/FuzzyStringComparisonTolerance.cs index ddbfeb1..30923ed 100644 --- a/FuzzyString/FuzzyStringComparisonTolerance.cs +++ b/FuzzyString/FuzzyStringComparisonTolerance.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FuzzyString +namespace FuzzyString { public enum FuzzyStringComparisonTolerance { diff --git a/FuzzyString/HammingDistance.cs b/FuzzyString/HammingDistance.cs index 277164d..883ef04 100644 --- a/FuzzyString/HammingDistance.cs +++ b/FuzzyString/HammingDistance.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FuzzyString +namespace FuzzyString { public static partial class ComparisonMetrics { @@ -12,18 +6,17 @@ public static int HammingDistance(this string source, string target) { int distance = 0; - if (source.Length == target.Length) + if (source.Length != target.Length) return 99999; + + for (int i = 0; i < source.Length; i++) { - for (int i = 0; i < source.Length; i++) + if (!source[i].Equals(target[i])) { - if (!source[i].Equals(target[i])) - { - distance++; - } + distance++; } - return distance; } - else { return 99999; } + + return distance; } } } diff --git a/FuzzyString/JaccardDistance.cs b/FuzzyString/JaccardDistance.cs index 7221e89..f6fb1f0 100644 --- a/FuzzyString/JaccardDistance.cs +++ b/FuzzyString/JaccardDistance.cs @@ -1,21 +1,18 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double JaccardDistance(this string source, string target) + public static float JaccardDistance(this string source, string target) { return 1 - source.JaccardIndex(target); } - public static double JaccardIndex(this string source, string target) + public static float JaccardIndex(this string source, string target) { - return (Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Union(target).Count())); + return Convert.ToSingle(source.Intersect(target).Count()) / Convert.ToSingle(source.Union(target).Count()); } } -} +} \ No newline at end of file diff --git a/FuzzyString/JaroDistance.cs b/FuzzyString/JaroDistance.cs index 10002f6..ed14af4 100644 --- a/FuzzyString/JaroDistance.cs +++ b/FuzzyString/JaroDistance.cs @@ -1,29 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Linq; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double JaroDistance(this string source, string target) + public static float 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; - } + + string sourceTargetIntersetAsString = string.Concat(source.Intersect(target)); + string targetSourceIntersetAsString = string.Concat(target.Intersect(source)); + + float t = sourceTargetIntersetAsString.LevenshteinDistance(targetSourceIntersetAsString) / 2; + return (m / source.Length + m / target.Length + (m - t) / m) / 3; } } } diff --git a/FuzzyString/JaroWinklerDistance.cs b/FuzzyString/JaroWinklerDistance.cs index 310f5a5..e058897 100644 --- a/FuzzyString/JaroWinklerDistance.cs +++ b/FuzzyString/JaroWinklerDistance.cs @@ -1,40 +1,40 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double JaroWinklerDistance(this string source, string target) + public static float JaroWinklerDistance(this string source, string target) { - double jaroDistance = source.JaroDistance(target); - double commonPrefixLength = CommonPrefixLength(source, target); + float jaroDistance = source.JaroDistance(target); + float commonPrefixLength = CommonPrefixLength(source, target); - return jaroDistance + (commonPrefixLength * 0.1 * (1 - jaroDistance)); + return jaroDistance + commonPrefixLength * 0.1f * (1 - jaroDistance); } - public static double JaroWinklerDistanceWithPrefixScale(string source, string target, double p) + public static float JaroWinklerDistanceWithPrefixScale(string source, string target, float p) { - double prefixScale = 0.1; + float prefixScale; - if (p > 0.25) { prefixScale = 0.25; } // The maximu value for distance to not exceed 1 + if (p > 0.25) { prefixScale = 0.25f; } // The maximu value for distance to not exceed 1 else if (p < 0) { prefixScale = 0; } // The Jaro Distance else { prefixScale = p; } - double jaroDistance = source.JaroDistance(target); - double commonPrefixLength = CommonPrefixLength(source, target); + float jaroDistance = source.JaroDistance(target); + float commonPrefixLength = CommonPrefixLength(source, target); - return jaroDistance + (commonPrefixLength * prefixScale * (1 - jaroDistance)); + return jaroDistance + commonPrefixLength * prefixScale * (1 - jaroDistance); } - private static double CommonPrefixLength(string source, string target) + public static float CommonPrefixLength(string source, string target) { int maximumPrefixLength = 4; int commonPrefixLength = 0; - if (source.Length <= 4 || target.Length <= 4) { maximumPrefixLength = Math.Min(source.Length, target.Length); } + + if (source.Length <= 4 || target.Length <= 4) + { + maximumPrefixLength = Math.Min(source.Length, target.Length); + } for (int i = 0; i < maximumPrefixLength; i++) { diff --git a/FuzzyString/LevenshteinDistance.cs b/FuzzyString/LevenshteinDistance.cs index e016466..55d14ab 100644 --- a/FuzzyString/LevenshteinDistance.cs +++ b/FuzzyString/LevenshteinDistance.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics - { + { /// /// Calculate the minimum number of single-character edits needed to change the source into the target, /// allowing insertions, deletions, and substitutions. @@ -23,16 +19,13 @@ public static int LevenshteinDistance(this string source, string target) if (source.Length == 0) { return target.Length; } if (target.Length == 0) { return source.Length; } - int distance = 0; - - if (source[source.Length - 1] == target[target.Length - 1]) { distance = 0; } - else { distance = 1; } + var distance = source[source.Length - 1] == target[target.Length - 1] ? 0 : 1; var sourceInitial = source.Substring(0, source.Length - 1); var targetInitial = target.Substring(0, target.Length - 1); - return Math.Min(Math.Min(LevenshteinDistance(sourceInitial, target) + 1, - LevenshteinDistance(source, targetInitial)) + 1, - LevenshteinDistance(sourceInitial, targetInitial) + distance); + + var min = Math.Min(LevenshteinDistance(sourceInitial, target) + 1, LevenshteinDistance(source, targetInitial) + 1); + return Math.Min(min, LevenshteinDistance(sourceInitial, targetInitial) + distance); } /// @@ -45,7 +38,7 @@ public static int LevenshteinDistance(this string source, string target) /// /// /// The Levenshtein distance, normalized so that the lower bound is always zero, rather than the difference in length between the two strings - public static double NormalizedLevenshteinDistance(this string source, string target) + public static float NormalizedLevenshteinDistance(this string source, string target) { int unnormalizedLevenshteinDistance = source.LevenshteinDistance(target); @@ -64,8 +57,8 @@ public static int LevenshteinDistanceUpperBounds(this string source, string targ if (source.Length == target.Length) { return source.HammingDistance(target); } // Otherwise, the upper bound is the length of the longer string. - else if (source.Length > target.Length) { return source.Length; } - else if (target.Length > source.Length) { return target.Length; } + if (source.Length > target.Length) { return source.Length; } + if (target.Length > source.Length) { return target.Length; } return 9999; } diff --git a/FuzzyString/LongestCommonSubsequence.cs b/FuzzyString/LongestCommonSubsequence.cs index de159bc..5b03324 100644 --- a/FuzzyString/LongestCommonSubsequence.cs +++ b/FuzzyString/LongestCommonSubsequence.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { @@ -10,20 +6,30 @@ public static partial class ComparisonMetrics { public static string LongestCommonSubsequence(this string source, string target) { - int[,] C = LongestCommonSubsequenceLengthTable(source, target); - - return Backtrack(C, source, target, source.Length, target.Length); + return BacktrackTable.Create(source, target).Backtrack(); } - private static int[,] LongestCommonSubsequenceLengthTable(string source, string target) + private struct BacktrackTable { - int[,] C = new int[source.Length + 1, target.Length + 1]; + private readonly int[,] C; + private readonly string source; + private readonly string target; - for (int i = 0; i < source.Length + 1; i++) { C[i, 0] = 0; } - for (int j = 0; j < target.Length + 1; j++) { C[0, j] = 0; } + private BacktrackTable(int[,] C, string source, string target) + { + this.C = C; + this.source = source; + this.target = target; + } - for (int i = 1; i < source.Length + 1; i++) + public static BacktrackTable Create(string source, string target) { + int[,] C = new int[source.Length + 1, target.Length + 1]; + + for (int i = 0; i < source.Length + 1; i++) { C[i, 0] = 0; } + for (int j = 0; j < target.Length + 1; j++) { C[0, j] = 0; } + + for (int i = 1; i < source.Length + 1; i++) for (int j = 1; j < target.Length + 1; j++) { if (source[i - 1].Equals(target[j - 1])) @@ -35,31 +41,33 @@ public static string LongestCommonSubsequence(this string source, string target) C[i, j] = Math.Max(C[i, j - 1], C[i - 1, j]); } } - } - - return C; - } - private static string Backtrack(int[,] C, string source, string target, int i, int j) - { - if (i == 0 || j == 0) - { - return ""; + return new BacktrackTable(C, source, target); } - else if (source[i - 1].Equals(target[j - 1])) + + public string Backtrack() { - return Backtrack(C, source, target, i - 1, j - 1) + source[i - 1]; + return Backtrack(source.Length, target.Length); } - else + + private string Backtrack( int i, int j) { - if (C[i, j - 1] > C[i - 1, j]) + if (i == 0 || j == 0) { - return Backtrack(C, source, target, i, j - 1); + return ""; } - else + + if (source[i - 1].Equals(target[j - 1])) { - return Backtrack(C, source, target, i - 1, j); + return Backtrack(i - 1, j - 1) + source[i - 1]; } + + if (C[i, j - 1] > C[i - 1, j]) + { + return Backtrack(i, j - 1); + } + + return Backtrack(i - 1, j); } } } diff --git a/FuzzyString/LongestCommonSubstring.cs b/FuzzyString/LongestCommonSubstring.cs index 6871a8b..a9c7efd 100644 --- a/FuzzyString/LongestCommonSubstring.cs +++ b/FuzzyString/LongestCommonSubstring.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FuzzyString { @@ -18,34 +15,33 @@ public static string LongestCommonSubstring(this string source, string target) StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < source.Length; i++) + for (int j = 0; j < target.Length; j++) { - for (int j = 0; j < target.Length; j++) + if (source[i] != target[j]) { - if (source[i] != target[j]) - { - L[i, j] = 0; - } + L[i, j] = 0; + } + else + { + if ((i == 0) || (j == 0)) + L[i, j] = 1; else - { - if ((i == 0) || (j == 0)) - L[i, j] = 1; - else - L[i, j] = 1 + L[i - 1, j - 1]; + L[i, j] = 1 + L[i - 1, j - 1]; - if (L[i, j] > maximumLength) + if (L[i, j] > maximumLength) + { + maximumLength = L[i, j]; + int thisSubsBegin = i - L[i, j] + 1; + if (lastSubsBegin == thisSubsBegin) + { + //if the current LCS is the same as the last time this block ran + stringBuilder.Append(source[i]); + } + else //this block resets the string builder if a different LCS is found { - maximumLength = L[i, j]; - int thisSubsBegin = i - L[i, j] + 1; - if (lastSubsBegin == thisSubsBegin) - {//if the current LCS is the same as the last time this block ran - stringBuilder.Append(source[i]); - } - else //this block resets the string builder if a different LCS is found - { - lastSubsBegin = thisSubsBegin; - stringBuilder.Length = 0; //clear it - stringBuilder.Append(source.Substring(lastSubsBegin, (i + 1) - lastSubsBegin)); - } + lastSubsBegin = thisSubsBegin; + stringBuilder.Length = 0; //clear it + stringBuilder.Append(source.Substring(lastSubsBegin, (i + 1) - lastSubsBegin)); } } } diff --git a/FuzzyString/Operations.cs b/FuzzyString/Operations.cs deleted file mode 100644 index a192068..0000000 --- a/FuzzyString/Operations.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FuzzyString -{ - public static partial class Operations - { - public static string Capitalize(this string source) - { - return source.ToUpper(); - } - - public static string[] SplitIntoIndividualElements(string source) - { - string[] stringCollection = new string[source.Length]; - - for (int i = 0; i < stringCollection.Length; i++) - { - stringCollection[i] = source[i].ToString(); - } - - return stringCollection; - } - - public static string MergeIndividualElementsIntoString(IEnumerable source) - { - string returnString = ""; - - for (int i = 0; i < source.Count(); i++) - { - returnString += source.ElementAt(i); - } - return returnString; - } - - public static List ListPrefixes(this string source) - { - List prefixes = new List(); - - for (int i = 0; i < source.Length; i++) - { - prefixes.Add(source.Substring(0, i)); - } - - return prefixes; - } - - public static List ListBiGrams(this string source) - { - return ListNGrams(source, 2); - } - - public static List ListTriGrams(this string source) - { - return ListNGrams(source, 3); - } - - public static List ListNGrams(this string source, int n) - { - List nGrams = new List(); - - if (n > source.Length) - { - return null; - } - else if (n == source.Length) - { - nGrams.Add(source); - return nGrams; - } - else - { - for (int i = 0; i < source.Length - n; i++) - { - nGrams.Add(source.Substring(i, n)); - } - - return nGrams; - } - } - } -} diff --git a/FuzzyString/OverlapCoefficient.cs b/FuzzyString/OverlapCoefficient.cs index 3c33fa0..4cf40bd 100644 --- a/FuzzyString/OverlapCoefficient.cs +++ b/FuzzyString/OverlapCoefficient.cs @@ -1,16 +1,13 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double OverlapCoefficient(this string source, string target) + public static float OverlapCoefficient(this string source, string target) { - return (Convert.ToDouble(source.Intersect(target).Count())) / Convert.ToDouble(Math.Min(source.Length, target.Length)); + return Convert.ToSingle(source.Intersect(target).Count()) / Convert.ToSingle(Math.Min(source.Length, target.Length)); } } } diff --git a/FuzzyString/RatcliffObershelpSimilarity.cs b/FuzzyString/RatcliffObershelpSimilarity.cs index 386340c..c421c7e 100644 --- a/FuzzyString/RatcliffObershelpSimilarity.cs +++ b/FuzzyString/RatcliffObershelpSimilarity.cs @@ -1,16 +1,13 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double RatcliffObershelpSimilarity(this string source, string target) + public static float RatcliffObershelpSimilarity(this string source, string target) { - return (2 * Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Length + target.Length)); + return 2 * Convert.ToSingle(source.Intersect(target).Count()) / Convert.ToSingle(source.Length + target.Length); } } } diff --git a/FuzzyString/SorensenDiceDistance.cs b/FuzzyString/SorensenDiceDistance.cs index 9713eed..1064150 100644 --- a/FuzzyString/SorensenDiceDistance.cs +++ b/FuzzyString/SorensenDiceDistance.cs @@ -1,21 +1,18 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double SorensenDiceDistance(this string source, string target) + public static float SorensenDiceDistance(this string source, string target) { return 1 - source.SorensenDiceIndex(target); } - public static double SorensenDiceIndex(this string source, string target) + public static float SorensenDiceIndex(this string source, string target) { - return (2 * Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Length + target.Length)); + return 2 * Convert.ToSingle(source.Intersect(target).Count()) / Convert.ToSingle(source.Length + target.Length); } } } diff --git a/FuzzyString/TanimotoCoefficient.cs b/FuzzyString/TanimotoCoefficient.cs index 2cb8019..c5a156c 100644 --- a/FuzzyString/TanimotoCoefficient.cs +++ b/FuzzyString/TanimotoCoefficient.cs @@ -1,18 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Linq; namespace FuzzyString { public static partial class ComparisonMetrics { - public static double TanimotoCoefficient(this string source, string target) + public static float TanimotoCoefficient(this string source, string target) { - double Na = source.Length; - double Nb = target.Length; - double Nc = source.Intersect(target).Count(); + float Na = source.Length; + float Nb = target.Length; + float Nc = source.Intersect(target).Count(); return Nc / (Na + Nb - Nc); } diff --git a/FuzzyStringConsole/Program.cs b/FuzzyStringConsole/Program.cs index 503fba9..ad37901 100644 --- a/FuzzyStringConsole/Program.cs +++ b/FuzzyStringConsole/Program.cs @@ -10,20 +10,20 @@ namespace FuzzyStringConsole class Program { static void Main(string[] args) - { + { string kevin = "kevin"; string kevyn = "kevyn"; - List options = new List(); - options.Add(FuzzyStringComparisonOptions.UseJaccardDistance); - options.Add(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance); - options.Add(FuzzyStringComparisonOptions.UseOverlapCoefficient); - options.Add(FuzzyStringComparisonOptions.UseLongestCommonSubsequence); - options.Add(FuzzyStringComparisonOptions.CaseSensitive); + var options = FuzzyStringComparisonOptions.UseJaccardDistance + | FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance + | FuzzyStringComparisonOptions.UseOverlapCoefficient + | FuzzyStringComparisonOptions.UseLongestCommonSubsequence + | FuzzyStringComparisonOptions.UseLevenshteinDistance + | FuzzyStringComparisonOptions.CaseSensitive; - Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Weak, options.ToArray())); - Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Normal, options.ToArray())); - Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Strong, options.ToArray())); + Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Weak, options)); + Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Normal, options)); + Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Strong, options)); Console.ReadLine(); }