プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC#

C#再勉強


実戦で役立つ Cプログラミングのイディオム/定石&パターン


私が独学でC#の学習を始めた初期の頃、独習C 第3版と並んで内容が理解しやすかった
Cプログラミング入門の筆者が新しい本を出していたので買ってみた。


C#の勉強は途中から自分が作りたいものがある時、必要な技術だけを抜粋して調べる様になっていたので、基礎から再入門のつもりで本書を一通りこなしてみるつもりだ。


CSV取込とDictionaryクラスを使った面白い例題。
※私が今までDictionaryとか殆どつかってなかっただけ(笑)

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

namespace ConsoleApp_SaleCSV {
    class Program {
        static void Main(string[] args) {
            SaleCounter sales = new SaleCounter(ReadSales("Sales.csv"));
            Dictionary<string, int> amountPerStore = sales.GetPerStoreSales();
            foreach(KeyValuePair<string,int> obj in amountPerStore){
                Console.WriteLine("{0},{1}", obj.Key, obj.Value);
            }

        }

        static List<Sale>ReadSales(string filePath) {
            List<Sale> sales = new List<Sale>();
            string[] lines = File.ReadAllLines(filePath);

            foreach(string line in lines) {
                string[] items = line.Split(',');
                Sale sa = new Sale {
                    ShopName = items[0],
                    productCategry = items[1],
                    Amount = int.Parse(items[2])
                };
                sales.Add(sa);
            }
            return sales;
        }
    }
}

namespace ConsoleApp_SaleCSV {
    class Sale {
        //店舗名
        public string ShopName { get; set; }

        //商品カテゴリ
        public string productCategry { get; set; }

        //売上高
        public int Amount { get; set; }
    }
}

using System.Collections.Generic;

namespace ConsoleApp_SaleCSV {
    class SaleCounter {
        private List<Sale> _sales;

        public SaleCounter(List<Sale> sales) {
            _sales = sales;
        }

        public Dictionary<string, int> GetPerStoreSales() {
            var dict = new Dictionary<string, int>();
            foreach(Sale sale in _sales) {
                if (dict.ContainsKey(sale.ShopName))
                    dict[sale.ShopName] += sale.Amount;
                else
                    dict[sale.ShopName] = sale.Amount;
            }
            return dict;
        }
    }
}

CSV中身
店舗A,商品A,1000
店舗A,商品B,1500
店舗B,商品C,3000
店舗B,商品A,1000
店舗A,商品A,1000
店舗C,商品B,1500
店舗C,商品B,1500
店舗C,商品B,1500
店舗A,商品C,3000


実行結果
f:id:tos5511:20170311181241p:plain

うん、SQL書いた方が楽だな(笑)