private static void ProcessXPaths(IDictionary <string, XPathInfo> xpathInfos) { foreach (XPathInfo xPathInfo1 in xpathInfos.Values) { foreach (XPathInfo xPathInfo2 in xpathInfos.Values) { try { if (xPathInfo1.InnerText != xPathInfo2.InnerText) { int maximumNumberOfCharatersToEvaluate = xPathInfo1.InnerText.Length > xPathInfo2.InnerText.Length ? xPathInfo2.InnerText.Length : xPathInfo1.InnerText.Length; maximumNumberOfCharatersToEvaluate = maximumNumberOfCharatersToEvaluate > 1000 ? 1000 : maximumNumberOfCharatersToEvaluate; int levenstheinDistance = UserDefinedFunctions.ComputeLevenstheinDistance(xPathInfo1.InnerText.Substring(0, maximumNumberOfCharatersToEvaluate), xPathInfo2.InnerText.Substring(0, maximumNumberOfCharatersToEvaluate)).Value; xPathInfo1.LevenstheinDistance += levenstheinDistance; xPathInfo2.LevenstheinDistance += levenstheinDistance; } } catch { } } } }
public string Suggest(string input) { if (!Check(input)) { ulong hash = Strings.GenerateFuzzyHashCode(input); if (_hashesAndStrings.ContainsKey(hash)) { HashSet <string> hashSet = _hashesAndStrings[hash]; Dictionary <string, int> sortedSuggestions = new Dictionary <string, int>(); foreach (string suggestion in hashSet) { sortedSuggestions.Add(suggestion, UserDefinedFunctions.ComputeLevenstheinDistance(input, suggestion).Value); } return(sortedSuggestions.OrderBy(ss => ss.Value).First().Key); } else { ulong numberOfSetBits = Numbers.NumberOfSetBits(hash); Dictionary <string, int> sortedSuggestions = new Dictionary <string, int>(); foreach (KeyValuePair <ulong, HashSet <string> > keyValuePair in _hashesAndStrings) { if (Numbers.NumberOfSetBits(hash & keyValuePair.Key) >= numberOfSetBits * 0.75) { foreach (string suggestion in keyValuePair.Value) { int levenstheinDistance = UserDefinedFunctions.ComputeLevenstheinDistance(input, suggestion).Value; sortedSuggestions.Add(suggestion, levenstheinDistance); if (levenstheinDistance <= 3) { return(suggestion); } } } } if (sortedSuggestions.Count != 0) { return(sortedSuggestions.OrderBy(ss => ss.Value).First().Key); } } return(null); } return(input); }