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
                    {
                    }
                }
            }
        }
Exemple #2
0
        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);
        }