public static ArrayDiffsResult <T> BuildArrayDiffsForLargeArrays <T>( IList <T> leftList, IList <T> rightList, IEqualityComparer <T> comparer) { comparer = comparer ?? EqualityComparer <T> .Default; var result = new ArrayDiffsResult <T>( new List <T>(), new List <T>(), new List <LeftRightItemPair <T> >() ); // Build both map from item to item index. var leftMap = new Dictionary <T, int>(leftList.Count, comparer); leftList.ForAll((index, x) => leftMap.Add(x, index)); var rightMap = new Dictionary <T, int>(leftList.Count, comparer); rightList.ForAll((index, x) => rightMap.Add(x, index)); // Append left items, either unique or common with right items foreach (var left in leftList) { var rightIndex = MapIndexOf(rightMap, left); if (rightIndex >= 0) { result.CommonItems.Add(new LeftRightItemPair <T>(left, rightList[rightIndex])); } else { result.LeftOnlyItems.Add(left); } } // Append right items (unique ones only) foreach (var right in rightList) { var leftIndex = MapIndexOf(leftMap, right); if (leftIndex < 0) { result.RightOnlyItems.Add(right); } } return(result); }
public static ArrayDiffsResult <T> BuildArrayDiffsForSmallArrays <T>( IList <T> leftList, IList <T> rightList, IEqualityComparer <T> comparer) { comparer = comparer ?? EqualityComparer <T> .Default; var result = new ArrayDiffsResult <T>( new List <T>(), new List <T>(), new List <LeftRightItemPair <T> >() ); // Append left items, either unique or common with right items foreach (var left in leftList) { var index = ListIndexOf(rightList, left, comparer); if (index >= 0) { result.CommonItems.Add(new LeftRightItemPair <T>(left, rightList[index])); } else { result.LeftOnlyItems.Add(left); } } // Append right items (unique ones only) foreach (var right in rightList) { var index = ListIndexOf(leftList, right, comparer); if (index < 0) { result.RightOnlyItems.Add(right); } } return(result); }