C# NuGetパッケージ

####対象読者
C#初心者だけど、少しコード分かる。

####NuGetとは?
外部パッケージを取得するためのシステム。取得することによって外部パッケージが使えるようになる。

####具体的に
macになるが、プロジェクトのManager NuGet Packagesって書かれたところをクリックすると下画像のようなものが出てくる。

<img width="1440" alt="スクリーンショット 2019-12-01 16.30.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/4cfbdf62-8ee3-28cb-928e-ab35ffb90ae7.png">

ここでダウンロードしたいものを選択。一番上のNewtonsoft.Jsonをダウンロード。これはJsonを扱うためのパッケージである。
これで、Newtonsoft.Jsonのパッケージが使えるようになる。

##具体的なパッケージ
以下自分が使ったことのあるパッケージを書いていく。
ただ現状少ないので、ちまちま新しいものに挑戦しつつ追加していく。

####Newtonsoft.Jsonパッケージ
今までと同じように、usingで新しくパッケージを使うことができる。

######ObjectからJson,JsonからObject

```cs:Program.cs
using System;
using Newtonsoft.Json;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var Apple = new Fruit("Apple", 5, 180);
            var Json = JsonConvert.SerializeObject(Apple);
            Console.WriteLine(Json);
            Console.WriteLine("**********");
            var Obj = JsonConvert.DeserializeObject<Fruit>(Json);
            Console.WriteLine(Obj);
        }
    }

    public class Fruit
    {
        public Fruit(string Name, int Number, int Price)
        {
            this.Name = Name;
            this.Number = Number;
            this.Price = Price;
        }

        public override string ToString()
        {
            var Result = "Name = " + Name +
                         ",Number = " + Number +
                         ",Price = " + Price;
            return Result;
        }

        public string Name { get; set; }
        public int Number { get; set; }
        public int Price { get; set; }
    }
}

```

実行結果

```
{"Name":"Apple","Number":5,"Price":180}
**********
Name = Apple,Number = 5,Price = 180
```

``` JsonConvert.SerializaObject(object) ```でobjctをjsonに変換する。
```JsonConvert.DeserializaObject(json)```でjsonをobjectに変換する。

######ListからJson,JsonからList

```cs:Program.cs
using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var Apple = new Fruit("Apple", 5, 180);
            var Banana = new Fruit("Banana", 8, 220);
            var Cherry = new Fruit("Cherry", 4, 190);
            var list = new List<Fruit>() { Apple, Banana, Cherry };
            //var array = new Fruit[] { Apple, Banana, Cherry };
            var Json = JsonConvert.SerializeObject(list);
            Console.WriteLine(Json);
            Console.WriteLine("**********");
            var Objs = JsonConvert.DeserializeObject<List<Fruit>>(Json);
            foreach(var item in Objs)
            {
                Console.WriteLine(item);
            }
        }
    }
```

実行結果

```
[{"Name":"Apple","Number":5,"Price":180},{"Name":"Banana","Number":8,"Price":220},{"Name":"Cherry","Number":4,"Price":190}]
**********
Name = Apple,Number = 5,Price = 180
Name = Banana,Number = 8,Price = 220
Name = Cherry,Number = 4,Price = 190
```

Fruitクラスは上で定義しているので省略。
listでも配列でもjsonは同様のものとなる。

####System.Data.SQLite.Core

```cs:Program.cs
using System;
using System.Collections.Generic;
using System.Data.SQLite;

namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            Create();
            var fruit = new Fruit();
            fruit.Id = 1;
            fruit.Name = "Apple";
            fruit.Number = 3;
            fruit.Price = 280;
            INSERT(fruit);
            fruit = new Fruit();
            fruit.Id = 2;
            fruit.Name = "Banana";
            fruit.Number = 8;
            fruit.Price = 180;
            INSERT(fruit);
            All();
            DELETE();
        }

        public static void Create()
        {
            var ConnectionStr = new SQLiteConnectionStringBuilder() { DataSource = "test.db" };
            using (var Connection = new SQLiteConnection(ConnectionStr.ToString()))
            {
                Connection.Open();

                using(var Command = new SQLiteCommand(Connection))
                {
                    Command.CommandText = "CREATE TABLE IF NOT EXISTS fruit(id INTEGER, name TEXT, number INTEGER, price INTEGER)";
                    Command.ExecuteNonQuery();
                }
            }
        }

        public static void DELETE()
        {
            var ConnectionStr = new SQLiteConnectionStringBuilder() { DataSource = "test.db" };
            using (var Connection = new SQLiteConnection(ConnectionStr.ToString()))
            {
                Connection.Open();

                using (var Command = new SQLiteCommand(Connection))
                {
                    Command.CommandText = "DELETE FROM fruit";
                    Command.ExecuteNonQuery();
                }
            }
        }

        public static void INSERT(Fruit fruit)
        {
            var ConnectionStr = new SQLiteConnectionStringBuilder() { DataSource = "test.db" };
            using (var Connection = new SQLiteConnection(ConnectionStr.ToString()))
            {
                Connection.Open();

                using (var Command = new SQLiteCommand(Connection))
                {
                    Command.CommandText = "INSERT INTO fruit(id, name, number, price)VALUES(:id, :name, :number, :price)";
                    Command.Parameters.Add(new SQLiteParameter("id", fruit.Id));
                    Command.Parameters.Add(new SQLiteParameter("name", fruit.Name));
                    Command.Parameters.Add(new SQLiteParameter("number", fruit.Number));
                    Command.Parameters.Add(new SQLiteParameter("price", fruit.Price));
                    Command.ExecuteNonQuery();
                }
            }
        }

        public static void All()
        {
            var list = new List<Fruit>();
            var ConnectionStr = new SQLiteConnectionStringBuilder() { DataSource = "test.db" };
            using (var Connection = new SQLiteConnection(ConnectionStr.ToString()))
            {
                Connection.Open();

                using (var Command = new SQLiteCommand(Connection))
                {
                    Command.CommandText = "SELECT id, name, number, price FROM fruit";
                    using (var Reader = Command.ExecuteReader())
                    {
                        while (Reader.Read())
                        {
                            var fruit = new Fruit();
                            fruit.Id = Reader.GetInt32(0);
                            fruit.Name = Reader.GetString(1);
                            fruit.Number = Reader.GetInt32(2);
                            fruit.Price = Reader.GetInt32(3);
                            list.Add(fruit);
                        }
                    }
                }
            }

            foreach(var item in list)
            {
                Console.WriteLine(item);
            }
        }
    }

    public class Fruit
    {
        public override string ToString()
        {
            return "Id = " + Id + ", Name = " + Name + ", Number = " + Number + ", Price = " + Price;
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public int Number { get; set; }
        public int Price { get; set; }
    }
}

```

SQLITEの場合データベースを作成していなくてもDataSourceは勝手に作成されるので特に気にしなくてもよい。
``` var Connection = new SQLiteConnection(ConnectionStr.ToString())```の部分では設定からConnectionを作成する。Connectionはメモリリークの原因となるので必ずCloseしないとだめ。なので、usingを使う。
```var Command = new SQLiteCommand(Connection) ```はConnectionからコマンドを実行するためのインスタンスを取得する。これもクローズする必要がありusingを使う。
SELECT以外は``` CommandText``` にSQL文を書いた後ExecuteNonQueryを実行する。
SELECTの場合は少し面倒で``` ExecuteReader``` メソッドから読み込みのためのインスタンスを取得。これもクローズが必要なのでusingが必要。```Reader.Read()``` はReaderを次の行に進めつつレコードがあればtrueを返しなければfalseを返す。値の取得は``` GetInt32()```や``` GetString()``` メソッドで引数にはカラムの順番を入れる。