//Improvement public List <SPListItem> MissingListItemsV1() { var results = new List <SPListItem>(); foreach (var list in this.GetExistingLists) { try { //get source list items IEnumerable <SPListItem> sourceListItems = null; if (SourceSiteCreds.SiteType == SiteType.WSS) { sourceListItems = this.SharePointRepository2007.GetListItems(list); } else { sourceListItems = this.SharePointRepository.GetListItems(SourceClientContext, list); } //get target list items List <SPListItem> targetListItems = this.SharePointRepository.GetListItems(TargetClientContext, list); //key is hashcode, while value is the actual list item Dictionary <int, SPListItem> hashedListItems = new Dictionary <int, SPListItem>(); bool useDefaultHashCode = false; //go retrieve all target list items and add it to the dictionary try { foreach (var listItem in targetListItems) { hashedListItems.Add(listItem.GetListItemHashCode(), listItem); } } catch (Exception ex) { if (ex.Message == "An item with the same key has already been added.") { //then we have a problem useDefaultHashCode = true; hashedListItems = new Dictionary <int, SPListItem>(); foreach (var listItem in targetListItems) { hashedListItems.Add(listItem.GetListItemDefaultHashCode(), listItem); } } } //get all list items, transform it and then compare key. foreach (var listItem in sourceListItems) { //string manipulation - convert source list items to its target list equivalent items and store it in a temp object SPListItem transformSourceListItem = new SPListItem() { FileDirRef = ConvertToTargetUrl(listItem.FileDirRef), FileRef = ConvertToTargetUrl(listItem.FileRef), ID = listItem.ID, Title = listItem.Title, ModifiedDate = listItem.ModifiedDate, ListBaseType = listItem.ListBaseType, EncodedAbsUrl = listItem.EncodedAbsUrl, Name = listItem.Name }; //HashSet comparision - faster than List<> -- comparision based on the hashcode int targetKeyHashCode = (useDefaultHashCode) ? transformSourceListItem.GetListItemDefaultHashCode() : transformSourceListItem.GetListItemHashCode(); if (!hashedListItems.ContainsKey(targetKeyHashCode)) { logger.Log(LogLevel.Info, $"Missing ListItem:{listItem.FileRef}"); results.Add(listItem); } } } catch (Exception ex) { logger.Log(LogLevel.Error, ex); } } return(results); }