public void RollbackTo(TrackableListTracker <T> tracker)
        {
            if (tracker == null)
            {
                throw new ArgumentNullException("tracker");
            }

            for (int i = ChangeList.Count - 1; i >= 0; i--)
            {
                var item = ChangeList[i];
                switch (item.Operation)
                {
                case TrackableListOperation.Insert:
                    tracker.TrackRemove(item.Index, item.NewValue);
                    break;

                case TrackableListOperation.Remove:
                    tracker.TrackInsert(item.Index, item.OldValue);
                    break;

                case TrackableListOperation.Modify:
                    tracker.TrackModify(item.Index, item.NewValue, item.OldValue);
                    break;

                case TrackableListOperation.PushFront:
                    tracker.TrackPopFront(item.NewValue);
                    break;

                case TrackableListOperation.PushBack:
                    tracker.TrackPopBack(item.NewValue);
                    break;

                case TrackableListOperation.PopFront:
                    tracker.TrackPushFront(item.OldValue);
                    break;

                case TrackableListOperation.PopBack:
                    tracker.TrackPushBack(item.OldValue);
                    break;
                }
            }
        }
        public void ApplyTo(TrackableListTracker <T> tracker)
        {
            if (tracker == null)
            {
                throw new ArgumentNullException("tracker");
            }

            foreach (var item in ChangeList)
            {
                switch (item.Operation)
                {
                case TrackableListOperation.Insert:
                    tracker.TrackInsert(item.Index, item.NewValue);
                    break;

                case TrackableListOperation.Remove:
                    tracker.TrackRemove(item.Index, item.OldValue);
                    break;

                case TrackableListOperation.Modify:
                    tracker.TrackModify(item.Index, item.OldValue, item.NewValue);
                    break;

                case TrackableListOperation.PushFront:
                    tracker.TrackPushFront(item.NewValue);
                    break;

                case TrackableListOperation.PushBack:
                    tracker.TrackPushBack(item.NewValue);
                    break;

                case TrackableListOperation.PopFront:
                    tracker.TrackPopFront(item.OldValue);
                    break;

                case TrackableListOperation.PopBack:
                    tracker.TrackPopBack(item.OldValue);
                    break;
                }
            }
        }