C#で簡単なタスク管理アプリを作って勉強してみた

はじめまして。進藤京介と申します。この記事は初投稿で自分の勉強記録です:green_book:

独習C#を読んで、実戦で役立つ C#プログラミングのイディオム/定石&パターン を途中まで読みました。
何か作ってみたいと思い、簡単なタスク管理アプリなら作れるかもと思ったので作ってみました:hamburger:

作ったものは
タスクを見る。追加する。削除する。という機能だけです。
コンソールアプリケーションです。

タスクはDictionary<string, string>で管理し、テキストファイルで読み書きをします。

起動すると

タスクを見る：0
タスクを追加する：1
タスクを削除する：2
終了:3

で入力を待ち、入力によってそれぞれの処理を行います。
タスクを追加・削除する際にテキストファイルに書き込みます。



```


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

/*
 * タスクアプリケーション
 * 　◆機能
 * 　　・見る
 * 　　・登録する
 * 　　・削除する
 * 　◆参考サイト
 * 　　・http://amaxi.sitemix.jp/blog/archives/614
 * 　◆参考書籍
 * 　　・独習C# 第3版
 * 　　・実戦で役立つ C#プログラミングのイディオム/定石&パターン
 * */


```




```C#:Program.cs
    class Program
    {
        private enum Cmd
        {
            Show,
            Add,
            Delete,
            End,
        }

        private static Cmd _select;
        private static Task _taskList;

        static void Main(string[] args)
        {
            _taskList = new Task();
            ShowStartMenu();

            Console.Read();
        }
        
        static void ShowStartMenu()
        {

            Console.WriteLine("タスクアプリケーションです" +
            "\n----------------------------------------------\n" +
            "タスクを見る：0\nタスクを追加する：1\nタスクを削除する：2\n終了:3");

            string selectcmd = Console.ReadLine();
            //空文字か調べる
            if (string.IsNullOrEmpty(selectcmd))
            {
                Console.WriteLine("入力してください");
                ShowStartMenu();
            }

            try
            {
                _select = (Cmd)Convert.ToInt32(selectcmd);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("0 1 2 3 のみ入力できます");
                ShowStartMenu();
            }
            
            ShowCommandMenu(_select);
        }

        static void ShowCommandMenu(Cmd cmd)
        {

            switch (cmd){

                case Cmd.Show:
                    _taskList.ShowTask();
                    ShowStartMenu();
                    break;

                case Cmd.Add:

                    Console.WriteLine("日付を入力してください");
                    //int val = int.Parse(Console.ReadLine());
                    string date_str = Console.ReadLine();

                    Console.WriteLine("タスクを入力してください");
                    string task_str = Console.ReadLine();


                    _taskList.AddTask(date_str,task_str);
                    ShowStartMenu();


                    break;

                case Cmd.Delete:

                    Console.WriteLine("\n-----タスク一覧-----\n");
                    foreach (var task in _taskList.TaskList)
                    {
                        Console.WriteLine("{0}：{1}", task.Key, task.Value);
                    }

                    Console.WriteLine("\n--------------------\n");
                    Console.WriteLine("削除したいkeyを入力してください");

                    string delete_key = Console.ReadLine();

                    _taskList.RemoveTask(delete_key);  
                    
                    ShowStartMenu();

                    break;

                case Cmd.End:
                    Console.WriteLine("アプリケーションを終了します");
                    break;

                default:
                    Console.WriteLine("0 1 2 3 のみ入力できます");
                    ShowStartMenu();
                    break;

            }
        }
    }


```




```C#:Task.cs
    class Task
    {
 　　　　private Dictionary<string, string> _TaskDict = new Dictionary<string, string>();
        private string _filePath = @"D:\vegeta\ドキュメント\Cs\file\Task.txt";

        //コンストラクタ
        public Task()
        {
            //データソースを読み込む
           
            string line;
            try {
                using (var reader = new StreamReader(_filePath, Encoding.UTF8))
                {
                    while ((line = reader.ReadLine()) != null)
                    {
                        string key;
                        string value;

                        int sepPos = line.IndexOf("-");
                        if (sepPos < 0)
                        {
                            key = line;
                            value = "";
                        }
                        else
                        {
                            key = line.Substring(0, sepPos);
                            value = line.Substring(sepPos + 1);
                        }

                        _TaskDict[key] = value;

                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ファイルの読み込みに失敗しました" + e.Message);
            }
        }

        public Dictionary<string, string> TaskList
        {
            get { return _TaskDict; }
        }


        //タスクを追加する
        public void AddTask(string date,string value)
        {
            //要素を追加する
            this._TaskDict[date] = value;
            //要素を追加したのでテキストファイルに書き込む
            //テキストファイルを空にするメソッドを呼び出す
            RefreshFile(_filePath);
            //テキストファイルに書き込むメソッドを呼び出す
            WriteFile(_filePath);

        }

        //タスクを見る
        public void ShowTask()
        {
            Console.WriteLine("\n-----タスク一覧-----\n");
            foreach (var task in _TaskDict)
            {
                Console.WriteLine("{0}：{1}",task.Key,task.Value);
            }
            Console.WriteLine("\n--------------------\n");
        }


        //タスクを削除する
        public void RemoveTask(string value)
        {

            if(!_TaskDict.Keys.Contains(value))
                Console.WriteLine("指定された日付のタスクはありません。");
            else
            {
                _TaskDict.Remove(value);
                Console.WriteLine(value + "のタスクを削除しました");
                //テキストファイルを空にするメソッドを呼び出す
                RefreshFile(_filePath);
                //テキストファイルに書き込むメソッドを呼び出す
                WriteFile(_filePath);
            }
                
        }

        //テキストファイルを空にするメソッド
        private void RefreshFile(string filePath)
        {
            
            try
            {
                File.WriteAllText(filePath, "");
            }
            catch (Exception e)
            {
                Console.WriteLine("ファイルが見つかりませんでした" + e.Message);
            }
        }

        //テキストファイルに書き込むメソッド
        private void WriteFile(string filePath)
        {
            try
            {
                using (var writer = new StreamWriter(_filePath, append: true))
                {

                    foreach (var task in _TaskDict)
                        writer.WriteLine(task.Key + "-" + task.Value);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("書き込みに失敗しました" + e.Message);
            }
        }
    }
```


まだまだ課題が残っています。
Keyに日付を入れろと言ってますが文字列なら何でも入ります。

またテキストファイルからどうやってDictionaryに格納するのか全く思いつかなかったのですが
http://amaxi.sitemix.jp/blog/archives/614
のサイト様を参考にさせていただきました。

まだまだなので何かご意見ご指摘をいただけると嬉しいです:bow_tone1: