/* * Формат данных: * "{" + * "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); }