Подсчет общей суммы по количеству вхождений - C#

Узнай цену своей работы

Формулировка задачи:

Имеет файл в котором записано следующее: Тел 1 шт - 2000 Тел 5 шт - 8000 Ноут 1 шт - 10000 Ноут 3 шт - 25000 Нужно сделать следующее: Чтобы программа считала данные из файла, и когда пользователь введет, например, НоутНоутТелНоутТелТел, программа считала сумму общую сумму, то есть в данном примере должно получится: 31000. Как то так) Сижу себе головную боль придумываю)

Решение задачи: «Подсчет общей суммы по количеству вхождений»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace TelNout
{
    class Program
    {
        private static Dictionary<string, Dictionary<int, int>> priceList;
 
        static void Main(string[] args)
        {
            priceList = GetPriceListFromFile("price.txt");
            while (true)
            {
                var sum = GetSum(Console.ReadLine());
                Console.WriteLine(sum);
            }
        }
 
        private static Dictionary<string, Dictionary<int, int>> GetPriceListFromFile(string file)
        {
            var priceList = new Dictionary<string, Dictionary<int, int>>();
            var lines = File.ReadLines(file, Encoding.GetEncoding(1251));
            foreach (var line in lines)
            {
                var split = line.Split();
                var name = split[0];
                var count = int.Parse(split[1]);
                var price = int.Parse(split[4]);
                if(!priceList.ContainsKey(name))
                    priceList.Add(name, new Dictionary<int, int>());
                priceList[name].Add(count, price);
            }
            return priceList;
        }
 
        private static int GetSum(string line)
        {
            var pattern = @"[А-Я][а-я]{1,}";
            var regex = new Regex(pattern);
            var split = regex.Matches(line).Cast<Match>().Select(x => x.Value);
            var tuples = split.GroupBy(value => value).Select(x => Tuple.Create(x.Key, x.Count()));
            return tuples.Sum(x => GetPrice(x.Item1, x.Item2));
        }
 
        private static int GetPrice(string name, int count)
        {
            var keys = priceList[name].Keys.Cast<int>();
            var counts = GetBestCounts(keys, count);
            return counts.Sum(x => priceList[name][x]);
        }
 
        private static IEnumerable<int> GetBestCounts(IEnumerable<int> keys, int num)
        {
            var list = new List<int>();
            var array = keys.OrderByDescending(x => x).ToArray();
            var i = 0;
            while (true)
            {
                var sum = list.Sum() + array[i];
                if (sum <= num)
                {
                    list.Add(array[i]);
                    if(sum == num) return list;
                }
                else
                {
                    if (i++ >= array.Length)
                        break;
                }
            }
            throw new System.ArgumentException("В списке цен не нашли подходящий вариант");
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы