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; }
/// <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; } }