Пример #1
0
        // Cleans up redundancies.
        public void CleanUp()
        {
            // Replace ValueForRange where From == To with ValueAt.
            List <Value> values = Values.FindAll(v => v is ValueForLevelRange && ((ValueForLevelRange)v).From == ((ValueForLevelRange)v).To);

            if (values.Count > 0)
            {
                foreach (Value value in values)
                {
                    Replace(value, new ValueAt {
                        Level = ((ValueForLevelRange)value).From, Text = value.Text
                    });
                }
            }
            values = Values.FindAll(v => v is ValueForQualityRange && ((ValueForQualityRange)v).From == ((ValueForQualityRange)v).To);
            if (values.Count > 0)
            {
                foreach (Value value in values)
                {
                    Replace(value, new ValueAt {
                        Quality = ((ValueForQualityRange)value).From, Text = value.Text
                    });
                }
            }

            // Get level-based table values and perform redundancy checks.
            LookupTable    table;
            List <ValueAt> tableValues      = Values.FindAll(v => v is ValueAt && ((ValueAt)v).LevelSpecified).Cast <ValueAt>().ToList();
            bool           hasLevelTable    = false;
            bool           levelTableIsFull = false;

            if (tableValues.Count > 0)
            {
                float[] dummy = new float[] { 1 };
                table = new LookupTable();
                foreach (ValueAt value in tableValues)
                {
                    table.Add(value.Level, dummy);
                }

                hasLevelTable    = true;
                levelTableIsFull = table.IsFull();

                // Remove obsolete level ranges and per level gains.
                Values.RemoveAll(v => (v is ValueForLevelRange || v is ValuePerLevel) && table.IsCovering(v));
            }

            // Get quality-based table values and perform redundancy checks.
            tableValues = Values.FindAll(v => v is ValueAt && ((ValueAt)v).QualitySpecified).Cast <ValueAt>().ToList();
            bool qualityTableIsFull = false;

            if (tableValues.Count > 0)
            {
                float[] dummy = new float[] { 1 };
                table = new LookupTable();
                foreach (ValueAt value in tableValues)
                {
                    table.Add(value.Quality, dummy);
                }

                qualityTableIsFull = table.IsFull();

                // Remove obsolete quality ranges and per quality gains.
                Values.RemoveAll(v => v is ValueForQualityRange && table.IsCovering(v) || v is ValuePerQuality && qualityTableIsFull);
            }

            // Remove obsolete ValueAt for any level if level table is full.
            if (hasLevelTable && levelTableIsFull)
            {
                Values.RemoveAll(v => v is ValueAt && !((ValueAt)v).LevelSpecified && !((ValueAt)v).QualitySpecified);
            }

            LookupRanges ranges;
            List <ValueForLevelRange> levelRangeValues = Values.FindAll(v => v is ValueForLevelRange).Cast <ValueForLevelRange>().ToList();
            bool hasLevelRanges   = false;
            bool levelRangeIsFull = false;

            if (levelRangeValues.Count > 0)
            {
                float[] dummy = new float[] { 1 };
                ranges = new LookupRanges();
                foreach (ValueForLevelRange value in levelRangeValues)
                {
                    ranges.Add(value.From, value.To, dummy);
                }

                hasLevelRanges   = true;
                levelRangeIsFull = ranges.IsFull();

                // Remove obsolete level gains.
                Values.RemoveAll(v => v is ValuePerLevel && ranges.IsCovering(v));
            }

            List <ValueForQualityRange> qualityRangeValues = Values.FindAll(v => v is ValueForQualityRange).Cast <ValueForQualityRange>().ToList();
            bool qualityRangesIsFull = false;

            if (qualityRangeValues.Count > 0)
            {
                float[] dummy = new float[] { 1 };
                ranges = new LookupRanges();
                foreach (ValueForQualityRange value in qualityRangeValues)
                {
                    ranges.Add(value.From, value.To, dummy);
                }

                qualityRangesIsFull = ranges.IsFull();

                // Remove obsolete level gains.
                if (qualityRangesIsFull)
                {
                    Values.RemoveAll(v => v is ValuePerQuality);
                }
            }

            // Remove obsolete ValueAt for any level if level range is full.
            if (hasLevelRanges && levelRangeIsFull)
            {
                Values.RemoveAll(v => v is ValueAt && !((ValueAt)v).LevelSpecified && !((ValueAt)v).QualitySpecified);
            }
        }