Подсчет общей суммы по количеству вхождений - 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("В списке цен не нашли подходящий вариант");
}
}
}