キャンプ会計アプリを作成しよう。
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 MainClass {
        public static void Main(string[] args) {
            var memberPays = new Dictionary<string,int>();
            var itemAmounts = new Dictionary<string, int>();
            var priceSum = 0;
           
            Console.WriteLine("csvデータ");
            Console.WriteLine("——————");
            using (var reader =new StreamReader("./data.csv")) {
                string line;
                while ((line = reader.ReadLine()) != null) {
                    Console.WriteLine(line);
                    var data = line.Split(',');
                    var price = int.Parse(data[2]);
                    priceSum += price;
                    if (memberPays.ContainsKey(data[0])) {
                        memberPays[data[0]] += price;
                    } else {
                        memberPays[data[0]] = price;
                    }
                    if (itemAmounts.ContainsKey(data[1])) {
                        itemAmounts[data[1]] += price;
                    } else {
                        itemAmounts[data[1]] = price;
                    }
                }
            }
            Console.WriteLine("\nキャンプ会計");
            Console.WriteLine("——————");
           
            itemAmounts.OrderByDescending(kv => kv.Value).ToList()
                .ForEach(kv=>Console.WriteLine($"{kv.Key}: {kv.Value}"));

            Console.WriteLine("——————");
            Console.WriteLine($"合計: {priceSum}円");

            var perPay = priceSum / memberPays.Count;

            Console.WriteLine($"\n個人別会計(一人あたり:{perPay}円)");
            Console.WriteLine("——————");
           
            memberPays
                .OrderByDescending(kv => kv.Value).ToList()
                .ForEach(kv => Console.WriteLine($"{kv.Key}:{(kv.Value-perPay>0?"+":"")}{kv.Value-perPay}"));

        }
    }
}