private List<ElementMatch<Element>> FindCorrespondingElements(IEnumerable<Element> elementsA, Element[] elementsB)
        {
            var elementMatches = new List<ElementMatch<Element>>();

            foreach (var element in elementsA)
            {
                Tuple<ElementMatch<Element>, decimal>[] matches;
                if (HasSimilarElements(element, elementsB, out matches))
                {
                    var elementMatch = new ElementMatch<Element>
                    {
                        This = element,
                        Matches = new Queue<Tuple<ElementMatch<Element>, decimal>>(matches)
                    };

                    elementMatch.SetToNext();
                    elementMatches.Add(elementMatch);
                }
            }

            return elementMatches;
        }
示例#2
0
        /// <summary>
        /// Attempts to determine which element on page A corresponds to which element on page B.
        /// </summary>
        /// <returns>A collection of mappings.</returns>
        private void CorrespondingElements(Scrape pageA, Scrape pageB, decimal maxDistance)
        {
            var elementMatches = new List<ElementMatch<ScrapedElement>>();

            foreach (var element in pageA.Elements)
            {
                ScrapedElement match;
                Tuple<ElementMatch<ScrapedElement>, decimal>[] matches;

                if (_elementMapper.HasExactMatch(element, pageB.Elements, out match) || _elementMapper.HasIdMatch(element, pageB.Elements, out match))
                {
                    element.CorrespondingScrapedElement = match;
                    match.CorrespondingScrapedElement = element;
                }
                else if (_elementMapper.HasSimilarElements(element, pageB.Elements, maxDistance, out matches))
                {
                    var elementMatch = new ElementMatch<ScrapedElement>
                    {
                        This = element,
                        Matches = new Queue<Tuple<ElementMatch<ScrapedElement>, decimal>>(matches)
                    };

                    elementMatch.SetToNext();
                    elementMatches.Add(elementMatch);
                }
            }

            // Resolve conflicts
            _conflictResolver.ResolveAllConflicts(elementMatches.ToArray());

            foreach (var element in elementMatches.Where(m => m.Match != null))
            {
                element.This.CorrespondingScrapedElement = element.Match.This;
                element.Match.This.CorrespondingScrapedElement = element.This;
            }
        }