private IEnumerable <IMergeOperation <Q> > ProcessTableForTableMemberChanges <Q>(ITable sourceTable, IEnumerable <Q> originalMembers, IEnumerable <Q> refreshedMembers, Func <Q, object> sorter, OperationFactory <Q> factory, IEqualityComparer <Q> comparer) where Q : class, ITableMember <Q> { var results = new HashSet <IMergeOperation <Q> >(); // Check for added members List <Q> newMembers = originalMembers.Compliment(refreshedMembers).ToList(); newMembers.ForEach( t => results.Add(factory.AdditionOp(sourceTable, t))); // Check for removed members List <Q> removedMembers = refreshedMembers.Compliment(originalMembers).ToList(); removedMembers.ForEach( t => results.Add(factory.RemovalOp(t))); // Check for changed members IEnumerable <Q> intersection1 = originalMembers.Intersect(refreshedMembers, comparer).OrderBy(sorter); var x = refreshedMembers.Intersect(originalMembers, comparer).OrderBy(sorter); var commonItems = intersection1.Zip(refreshedMembers.Intersect(originalMembers, comparer).OrderBy(sorter)); string descriptionOfChanges; foreach (var memberPair in commonItems) { if (memberPair.Key.HasChanges(memberPair.Value, out descriptionOfChanges)) { results.Add(factory.ChangeOp(memberPair.Key, memberPair.Value, descriptionOfChanges)); } } return(results); }