private SearchResult FindBestMatch(ServiceAgnosticAlbum album, List<SearchResult> albumSearchResults)
{
if (albumSearchResults == null || !albumSearchResults.Any())
return null;
// first try to match based on identical artist and album name
var directMatch = albumSearchResults.Where(sr =>
sr.DisplayText.ToLower() == album.AlbumName.ToLower()
&& sr.DetailText.ToLower() == album.ArtistName.ToLower());
if (directMatch.Count() == 1)
return directMatch.First();
else if (directMatch.Count() > 1)
albumSearchResults = directMatch.ToList();
// next try to match just based on artist name
var artistMatch = albumSearchResults.Where(sr =>
sr.DetailText.ToLower() == album.ArtistName.ToLower());
if (artistMatch.Count() == 1)
return artistMatch.First();
else if (artistMatch.Count() > 1)
albumSearchResults = artistMatch.ToList();
// next we'll try to zero down on textually similar artist and albums
return albumSearchResults
.Where(sr =>
textComparisonAlgo.GetSimilarity(sr.DisplayText, album.AlbumName) +
textComparisonAlgo.GetSimilarity(sr.DetailText, album.ArtistName) > 1)
.OrderByDescending(sr =>
textComparisonAlgo.GetSimilarity(sr.DisplayText, album.AlbumName) +
textComparisonAlgo.GetSimilarity(sr.DetailText, album.ArtistName))
.FirstOrDefault();
}