public static EntityMapComparaeStatisticOne Diff(EntityMap left, EntityMap right, IEntityMapDiffHandler handler, IGameEntityCompareAgent gameEntityComparator, bool skipMissHandle = false)
        {
            int      entityCount    = 0;
            int      componentCount = 0;
            DateTime startTime      = DateTime.Now;

            //右值=>左值
            foreach (var rightEntry in right)
            {
                entityCount++;
                if (handler.IsBreak())
                {
                    break;
                }
                var         entityKey   = rightEntry.Key;
                var         rightEntity = rightEntry.Value;
                IGameEntity leftEntity;
                left.TryGetValue(entityKey, out leftEntity);

                if (leftEntity == null)
                {
                    if (!skipMissHandle)
                    {
                        handler.OnLeftEntityMissing(rightEntity);
                    }
                    continue;
                }
                componentCount += gameEntityComparator.Diff(leftEntity, rightEntity, skipMissHandle);
            }

            if (!handler.IsBreak() && !skipMissHandle)
            {
                foreach (var leftEntry in left)
                {
                    var entityKey  = leftEntry.Key;
                    var leftEntity = leftEntry.Value;

                    IGameEntity rightEntity;
                    if (!right.TryGetValue(entityKey, out rightEntity))
                    {
                        entityCount++;
                        handler.OnRightEntityMissing(leftEntity);
                    }
                }
            }

            return(new EntityMapComparaeStatisticOne
            {
                EntityCount = entityCount,
                ComponentCount = componentCount,
                CreateTime = DateTime.Now,
                Interval = (int)(startTime - startTime).TotalMilliseconds
            });
        }
        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);
        }