コード例 #1
0
        private void PreCalculate()
        {
            int currentDepartmentIndex = StartDepartment;
            int nextDepartmentIndex    = StartDepartment;
            var currentChecklist       = new Checklist(NumberOfStamps);

            do
            {
                currentDepartmentIndex = nextDepartmentIndex;
                var currentDepartment = _storage.GetDepartment(currentDepartmentIndex);
                nextDepartmentIndex      = currentDepartment.ProcessChecklist(currentChecklist);
                currentDepartment.Status = DepartmentStatus.Visited;

                if (_storage.Contains(currentDepartmentIndex, currentChecklist))
                {
                    currentDepartment.Status = DepartmentStatus.InCycle;
                    currentChecklist.InCycle = true;
                    if (!_storage.IsChecklistInCycle(currentDepartmentIndex, currentChecklist))
                    {
                        _storage.ReplaceChecklist(currentDepartmentIndex, currentChecklist.Clone() as Checklist);
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    _storage.AddChecklist(currentDepartmentIndex, currentChecklist.Clone() as Checklist);
                }
            } while (currentDepartmentIndex != EndDepartment);

            foreach (var department in _storage.GetDepartments().Where(department => department.Status == DepartmentStatus.NotVisited))
            {
                department.Status = DepartmentStatus.Inaccessible;
            }

            isReady = true;
        }