キャンプ会計アプリを作成しよう。
csvファイルからデータを読み込み。キャンプにかかった費用や個人の支払いなどを計算する。
詳しくは実行例を参考のこと。
なお、お買い物をしていない参加メンバーはいないものとする。
 
csvファイルは以下からダウンロードする。

[実行例]
csvデータ
——————
山田,ビール,4600
田中,ガソリン,5200
鈴木,駐車場,2500
田中,食材,6000
鈴木,ガソリン,2000
大野,食材,2400
山田,キャンプ場,10000

キャンプ会計
——————
キャンプ場:10000
食材:8400
ガソリン:7200
ビール:4600
駐車場:2500
——————
合計:32700円

個人別会計(一人あたり:8175円)
——————
山田:+6425
田中:+3025
鈴木:-3675
大野:-5775

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace kaikeiApp
{
    class Program
    {
        static Dictionary<string, int> items=new Dictionary<string, int>();
        static Dictionary<string, int> persons= new Dictionary<string, int>();
        static int total;
        static void Main(string[] args)
        {
            
            ReadFile();
            PrintItems();
            PrintPersons();
        }
        static void ReadFile(){
            Console.WriteLine("csvデータ");
            Console.WriteLine("------------------");
            using (var reader = new StreamReader(@"./data.csv"))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    var data = line.Split(',');
                    var personName = data[0];
                    var itemName = data[1];
                    var itemPrice = int.Parse(data[2]);
                    total += itemPrice;
                    if (items.ContainsKey(itemName))
                    {
                        items[itemName] = items[itemName] + itemPrice;
                    }
                    else
                    {
                        items.Add(itemName, itemPrice);
                    }
                    if (persons.ContainsKey(personName))
                    {
                        persons[personName] = persons[personName] + itemPrice;
                    }
                    else
                    {
                        persons.Add(personName, itemPrice);
                    }
                    Console.WriteLine(line);
                }
            }
            
        }
        static void PrintItems(){
            Console.WriteLine("\n\nキャンプ会計");
            Console.WriteLine("------------------");
           var itemSorted= items.OrderByDescending(v => v.Value);
            foreach(var kv in itemSorted){
                Console.WriteLine($"{kv.Key}:{kv.Value}");
            }
            Console.WriteLine("------------------");
            Console.WriteLine($"合計:{total}円");
        }
        static void PrintPersons(){
           
            var perPrice = Math.Ceiling((double)total / persons.Count);
            Console.WriteLine($"\n\n個人別会計(一人あたり:{perPrice}円)");
            Console.WriteLine("------------------");
            var sortedPersons = persons.OrderByDescending(v => v.Value);
            foreach (var kv in sortedPersons)
            {
                string suffix = " ";
                if (kv.Value > perPrice)
                {
                    suffix = "+";
                }
                else if (kv.Value < perPrice)
                {
                    suffix = "-";
                }
                Console.WriteLine($"{kv.Key}:{suffix}{Math.Abs(kv.Value - perPrice)}");
            }
        }
    }
}