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()); }
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); }