예제 #1
0
        public virtual IQueryable <Substate> GetAdmissibleSubstates([NotNull] State state)
        {
            Assert.ArgumentNotNull(state, "state");
            Assert.IsNotNull(this.StateManager, "Unable to get admissible sub-states. StateManager cannot be null.");

            SubstateCombinationSet substateCombinationSet = this.StateManager.GetSubstateCombinations(state);

            return((new StateValidator()).GetAdmissibleSubstates(state, substateCombinationSet).AsQueryable());
        }
예제 #2
0
        public virtual IEnumerable <Substate> GetAdmissibleSubstates([NotNull] State state, [NotNull] SubstateCombinationSet substateCombinationSet)
        {
            Assert.ArgumentNotNull(state, "state");
            Assert.ArgumentNotNull(substateCombinationSet, "substateCombinationSet");

            if (!substateCombinationSet.SubstateCombinations.Any())
            {
                return(state.Substates);
            }

            System.Collections.BitArray flags = new System.Collections.BitArray(state.Substates.Count);
            int index = 0;

            foreach (Substate substate in state.Substates)
            {
                flags[index] = substate.Active;
                ++index;
            }

            foreach (IDictionary <string, bool> substateCombination in substateCombinationSet.SubstateCombinations)
            {
                bool flag = state.Substates.Aggregate(
                    true, (current, substate) => current && ((!substate.Active) || substateCombination[substate.Code]));

                index = 0;
                foreach (Substate substate in state.Substates)
                {
                    flags[index] = flags[index] || (flag && substateCombination[substate.Code]);
                    ++index;
                }
            }

            LinkedList <Substate> result = new LinkedList <Substate>();

            index = 0;
            foreach (Substate substate in state.Substates)
            {
                if (flags[index])
                {
                    result.AddLast(substate);
                }

                ++index;
            }

            return(result);
        }