Example #1
0
        /*
         * Формат данных:
         *      "{" +
         *      "category : CategoryName = Pita, ProductName = Грузинский, Quantity = 10;" +
         *      "ingredient : Name = Мука, Value = 0.3, Calorie = 364, Price = 1.39;" +
         *      "ingredient : Name = Вода, Value = 0.1, Calorie = 0, Price = 0.016;" +
         *      "ingredient : Name = Соль, Value = 0.01, Calorie = 0, Price = 0.65;" +
         *      "}" +
         * и т.д.
         */

        /// <summary>
        /// Получить данные о производстве из строки.
        /// </summary>
        /// <param name="data_in">Строка с информацией о производстве</param>
        /// <returns>Возвращает массив содержащий объекты Products</returns>
        static public Products[] GetData(String data_in)
        {
            Products[] products_array;
            int        array_index = 0;

            List <string> blocks = new List <string> {
            };                                          //Промежуточный список для хранения блоков с параметрами для каждой категории.

            //0. Первичные преобразования строки
            String data = Regex.Replace(data_in, @"[ \r\n\t]", ""); //Избавляемся от пробелов, переносов


            //Патерн для разбиения строки на блоки.
            String pattern = @"\{([^\{\}]+)\}";     //где, \{	Совпадение с открывающей скобкой.

            // ([^\{\}]+)  Совпадение с любым символом, который не является открывающей или закрывающей круглой скобкой один или несколько раз.
            // \}   Совпадение с закрывающей скобкой
            //1. Извлечение блоков из строки на основе шаблона
            foreach (Match match in Regex.Matches(data, pattern))
            {
                blocks.Add(match.Groups[1].Value);
            }
            //Количество элементов больше 0?
            if (blocks.Count == 0)
            {
                return(_ = new Products[0]);//Пусто. Выход
            }
            else
            {
                products_array = new Products[blocks.Count];
            }

            //2. Извлечение данных из блоков
            foreach (var item in blocks)
            {
                //2.1. Существует ли параметр категория в строке?
                if (item.IndexOf("category") == -1) //не существует
                {
                    //Удаляем элемент из списка.
                    blocks.Remove(item);
                    continue;
                }

                //2.2. Разбиение блока на массив строк.
                string[]   string_array       = item.Split(';', StringSplitOptions.RemoveEmptyEntries);
                bool       category_is_excist = false;
                Products   product            = new Bread();
                Ingredient ingredient;

                //2.3. Определение категории (Без категории, блок игнорируется)
                foreach (var element in string_array)
                {
                    //Ищем параметр category
                    if (item.IndexOf("category") != -1)//Нашли
                    {
                        //Получаем введенную информацию
                        product = ParseCategory(element, ref category_is_excist);
                        break; //Выход из цикла foreach
                    }
                }


                if (category_is_excist == false)//Без категории, блок игнорируется
                {
                    //Удаляем элемент из списка.
                    blocks.Remove(item);
                    continue;
                }
                else
                {
                }
                //3. Получаем состав продукта.
                foreach (var string_array_item in string_array)
                {
                    //Ищем параметр ingredient
                    if (string_array_item.IndexOf("ingredient") != -1)//Нашли
                    {
                        ingredient = ParseIngredient(string_array_item);
                        //Добавляем к текущему продукту.
                        product.AddIngredient(ingredient);
                    }
                }

                product.PriceCalculate();    //Рассчет цены
                product.CaloriesCalculate(); //Рассчет калорий

                products_array[array_index++] = product;
            }

            return(products_array);
        }