public bool CopyStep(string step, string newStepName)
        {
            WizardStep originalStep = stepList.Where(p => p.Name.DecodedValue == step).FirstOrDefault();

            if (originalStep == null)
            {
                return(false);
            }
            WizardStep newStep = stepList.Where(p => p.Name.DecodedValue == newStepName).FirstOrDefault();

            if (newStep != null)
            {
                return(false);
            }
            newStep = originalStep.CreateCopy(newStepName);
            stepList.Add(newStep);
            return(true);
        }
        public override void LoadFromFolder(string folderPath)
        {
            objectName   = WSConstants.Objects.StepList;
            objectEnding = WSConstants.Markup.End;

            string stepsFolder        = Path.Combine(folderPath, stepsFolderName);
            string stepsOrderFilePath = Path.Combine(stepsFolder, wizardStepsOrderFileName);

            List <string> folderList = Directory.GetDirectories(stepsFolder).ToList();

            List <string> stepsOrder = File.ReadAllLines(stepsOrderFilePath).ToList();

            Dictionary <string, WizardStep> namedSteps = new Dictionary <string, WizardStep>();

            // Загрузить шаги из папки
            foreach (var fPath in folderList)
            {
                var        di          = new DirectoryInfo(fPath);
                string     newStepName = di.Name;
                WizardStep createdStep = new WizardStep();
                createdStep.LoadFromFolder(fPath);
                namedSteps.Add(newStepName, createdStep);
            }

            // 1. Искать по новому имени затем по старому (для переименованных)
            WizardStep step; string dictName;

            foreach (string stepName in stepsOrder)
            {
                dictName = stepName;
                if (!namedSteps.TryGetValue(stepName, out step))
                {
                    // Не лучшая идея одновременно переименовать и сделать копию, возьмется полуслучайно, на свой страх и риск кароч
                    var stepd = namedSteps.Where(p => p.Value.Name.DecodedValue == stepName).FirstOrDefault();
                    dictName = stepd.Key;
                    step     = stepd.Value;
                }
                if (step != null)
                {
                    step.Name.DecodedValue = dictName;
                    stepList.Add(step);
                    namedSteps.Remove(dictName);
                }
            }

            // 2. Второй заход, ищет по старому имени для того чтобы вставить параметры в порядке хоть немного похожем на первоначальный
            foreach (string stepName in stepsOrder)
            {
                List <string> remStepNames = new List <string>();
                foreach (var stepd in namedSteps.Where(p => p.Value.Name.DecodedValue == stepName))
                {
                    step     = stepd.Value;
                    dictName = stepd.Key;
                    step.Name.DecodedValue = dictName;
                    stepList.Add(step);
                    remStepNames.Add(dictName);
                }
                foreach (string dn in remStepNames)
                {
                    namedSteps.Remove(dn);
                }
            }

            // 3. Добавить оставшиеся (ну совсем новые) параметры в самый конец
            foreach (var stepd in namedSteps)
            {
                step     = stepd.Value;
                dictName = stepd.Key;
                step.Name.DecodedValue = dictName;
                stepList.Add(step);
            }
        }