public static int CompareEnumeratableGameComponents(IDictionary <int, IGameComponent> left,
                                                            IDictionary <int, IGameComponent> right, IEntityMapDiffHandler handler,
                                                            EntityDiffData diffCacheData)
        {
            var count = 0;

            foreach (var kv in left)
            {
                count++;
                var lv = kv.Value;
                var k  = kv.Key;

                IGameComponent rv;
                if (right.TryGetValue(k, out rv))
                {
                    if (!handler.IsExcludeComponent(rv))
                    {
                        handler.OnDiffComponent(diffCacheData.LeftEntity, lv, diffCacheData.RightEntity, rv);
                    }
                }
                else
                {
                    if (!handler.IsExcludeComponent(lv))
                    {
                        handler.OnRightComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity, lv);
                    }
                }
            }

            foreach (var kv in right)
            {
                count++;

                var k = kv.Key;
                if (!left.ContainsKey(k))
                {
                    var rv = kv.Value;
                    if (!handler.IsExcludeComponent(rv))
                    {
                        handler.OnLeftComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity, rv);
                    }
                }
            }

            return(count);
        }
        public static int CompareEnumeratableGameComponents(List <IGameComponent> left, List <IGameComponent> right,
                                                            IEntityMapDiffHandler diffHandler, EntityDiffData diffCacheData)
        {
            int  loopCount        = 0;
            var  leftEnumerator   = 0;
            var  rightEnumberator = 0;
            int  leftCount        = left.Count;
            int  rightCount       = right.Count;
            bool hasLeft          = leftEnumerator < leftCount;
            bool hasRight         = rightEnumberator < rightCount;

            while (hasLeft && hasRight && !diffHandler.IsBreak())
            {
                loopCount++;
                var leftComponent  = left[leftEnumerator];
                var rightComponent = right[rightEnumberator];
                int result         = GameComponentIComparer.Instance.Compare(leftComponent, rightComponent);
                if (result == 0)
                {
                    // component wise
                    leftEnumerator++;
                    rightEnumberator++;
                    hasLeft  = leftEnumerator < leftCount;
                    hasRight = rightEnumberator < rightCount;
                    if (!diffHandler.IsExcludeComponent(leftComponent))
                    {
                        diffHandler.OnDiffComponent(diffCacheData.LeftEntity, leftComponent, diffCacheData.RightEntity,
                                                    rightComponent);
                    }
                }
                else if (result < 0)
                {
                    if (!diffHandler.IsExcludeComponent(leftComponent))
                    {
                        diffHandler.OnRightComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity,
                                                            leftComponent);
                    }

                    leftEnumerator++;
                    hasLeft = leftEnumerator < leftCount;
                }
                else
                {
                    if (!diffHandler.IsExcludeComponent(rightComponent))
                    {
                        diffHandler.OnLeftComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity,
                                                           rightComponent);
                    }

                    rightEnumberator++;
                    hasRight = rightEnumberator < rightCount;
                }
            }

            while (hasLeft && !diffHandler.IsBreak())
            {
                loopCount++;
                var leftComponent = left[leftEnumerator];
                leftEnumerator++;
                hasLeft = leftEnumerator < leftCount;
                if (!diffHandler.IsExcludeComponent(leftComponent))
                {
                    diffHandler.OnRightComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity,
                                                        leftComponent);
                }
            }

            while (hasRight && !diffHandler.IsBreak())
            {
                loopCount++;

                var rightComponent = right[rightEnumberator];
                rightEnumberator++;
                hasRight = rightEnumberator < rightCount;
                if (!diffHandler.IsExcludeComponent(rightComponent))
                {
                    diffHandler.OnLeftComponentMissing(diffCacheData.LeftEntity, diffCacheData.RightEntity,
                                                       rightComponent);
                }
            }

            return(loopCount);
        }