C#の基礎からの学習メモ　その１

※この記事は勉強しているC#の内容をまとめた学習メモのような位置付けです。
サクラダファミリアの様に加筆しております。
表記の仕方は後々修正して整えますので寛大なる気持ちでどうぞよろしくお願いします。

##コンソール表示
-Console.WriteLine("Hello World!");　
コンソール上で改行を加えられた上で表示される

##Doubleの計算と表記
doubleの型で宣言をして計算処理した際に整数で出力処理をすると結果がコンマ以下の数値が削られて表示されなくなる
![スクリーンショット 2020-12-27 20.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/62fab163-e6fd-2799-00ff-c4fae5d85857.png)

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

##インスタンスについて
・インスタンス＝クラスと同じ呼び方

##voidとは？？
・void = 戻り値を返さないメソッド


##継承クラス
継承クラスにする場合には、子クラスが継承クラスとなる親クラスのフィールド値にアクセスできるようにprivateになっている変数はprotectedにしておかないといけない

<親クラス　（継承される側）>
![スクリーンショット 2021-01-02 22.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/09b7ea4d-3ce3-b8ad-81b9-5b468739e64f.png)


<子クラス　（継承する側）>
![スクリーンショット 2021-01-02 22.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/6f0fd52f-fc3b-a840-280e-05a5a19d1af4.png)

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

##最大値、最小値の計算方法
最大値、最小値を求める場合はMathのクラスを利用してMax,Minのメソッドを使用するが、その際はusing System.Linq;　を記述すること。
その際の記述方法は下記の通り

```C#
using System;
using System.Linq;

        static void Main () {

            // using System.Linq;が必要
            
            //空の配列を用意
            int[] numbers = new int[5];
            //今回はからの配列内にコンソールの入力値を格納
            for (int i = 0; i < 5; i++) {
                numbers[i] = int.Parse (Console.ReadLine ());
                //ex. 4 6 8 1 2 を入力
            }
            
            //以下のMax,Minメソッドを使用するのにLinqが必要
            Console.WriteLine (”最大値：{0}”, numbers.Max ());
            Console.WriteLine (”最小値：{0}”, numbers.Min ());

            //〜出力結果〜
            // 最大値:８
            // 最小値:1
        }
```

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

##配列の長さを変更する方法
配列の長さを定義後に可変する方法、配列でForeachを回した際に回している回数をカウントする方法

```c#

using System;

namespace Test_constructor{

   class Program
   {
        static void Main(string[] args) {

            int[] numbers = new int[3] { 4, 5, 6 };

            //配列サイズを１つ増やす
            Array.Resize(ref numbers, numbers.Length + 1);

            //numbersの配列長は配列カウント0スタートと違い1多いのでマイナス１
            numbers[numbers.Length - 1] = 7;

            foreach (var item in numbers.Select((value, index)
                                        => new { value, index }))
            {
                Console.WriteLine("foreachの{0}番目の要素の値は{1}です。", item.index , item.value);
            }
        }
    }
}
        //〜出力結果〜
        //foreachの0番目の要素の値は4です。
        //foreachの1番目の要素の値は5です。
        //foreachの2番目の要素の値は6です。
        //foreachの3番目の要素の値は7です。
```



〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

##累乗をするときの注意
Math.Pow(double x, double y)の計算をするときに整数のintと合わせて計算するときには、コンパイルエラーになる。
Math.Powは暗黙的にdoubleでの処理になるので、文頭に(int)を付加して記述すること

```C#
using System;

namespace for_Qiita_proj
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 2;
            int R = (int)Math.Pow(a, b);

            Console.WriteLine("{0}の{1}乗は{2}になる", a, b, R);
        }
    }
}
            //出力結果
　　　　　　　//10の2乗は100になる
```

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

##コンストラクタについての考え方

クラスをインスタンスで生成した際に最初に必ず実行されるプロパティやメソッドのことをコンストラクタという。
例えるならば、ポケモンを戦闘に呼び出した際にモンスターボールから出てきた時に必ず鳴き声をあげるような感じ(であってる??)
そのメソッドはインスタンスを生成しただけだとまだ何も実行されるはずはないが、必ず実施される

コンストラクタの用途 ： 初期化処理(地慣らしみたいな感じでしょうか)
コンストラクタの記載ルール ： クラス名と同じ表記で記述する(クラスが違うのでアクセスできるようにpublicで修飾すること)


```c#
using System;
using System.Collections.Generic;

namespace Test_constructor
{
    class Program{

         static void Main () {
             Console.WriteLine("welcome!!");
             Car c = new Car();
         }
    }

    //コンストラクタのためのCarクラス
    class Car{

        //コンストラクタはpublic + class名と同じ名前で記載すること！(publicがないと外部クラスからアクセスできない)
        //     ↓↓↓
        public Car() {
            Console.WriteLine("Carクラスからコンストラクタとして呼び出されています");
        }

        static void Hello(string name)
        {
            //このメソッドは呼び出されていないので出力されない
            Console.WriteLine("Hi,{0}",name);
        }
    }
}
            //出力結果
            //welcome!!
            //Carクラスからコンストラクタとして呼び出されています
            

```



##Dictionary型でのint型valueの加減乗除の方法
Dictionary型をforeachで回してKeyがヒットした場合にint型のvalueを書き換えようとしても値の上書きができません。
その為、書き換えをしたい際には、KeyのみをList型に格納して、そのListをForeachで回してDictionary型の変数を書き換えるのが良さそうです。
dictionary型自体をクラスにして加減乗除するというやり方もあるのですが、それはまた今度。(もし要望があれば書きたいと思います)


```C#:qiita.cs

using System;
using System.Collections.Generic;

namespace for_Qiita_proj
{
    class Program
    {
        static void Main(string[] args)
        {
            //まずは空のdictionary型を生成して変数に代入
            //<>内がKey, Valueの型になる(Key=string , Value=int)
            var myTable = new Dictionary<string, int>();

            //dictionary型の変数にkeyとvalueを追加
            myTable.Add("Hokkaido", 1);
            myTable.Add("Shimane", 2);
            myTable.Add("Aichi", 4);
            myTable.Add("Osaka", 8);

            //Dictionary型のままでそれをForeachで回してもintを余剰加減できないのでListにする
            List<string> keyList = new List<string>(myTable.Keys);

            //foreachで回すのは dictionaryでなく list
            foreach (var item in keyList)
            {
                if (item == "Aichi")
                {
                    //keyが一致した際のvalueを計算処理
                    myTable[item] -= 1;
                }
                Console.WriteLine("Key:{0} / Value:{1}", item, myTable[item]);
            }
        }
    }
}

      //出力結果
      //Key:Hokkaido / Value:1
      //Key:Shimane / Value:2
      //Key:Aichi / Value:3
      //Key:Osaka / Value:8
```
参照サイト:[Dictionaryの値をforeachで変更する【C#】](https://kan-kikuchi.hatenablog.com/entry/Dictionary_foreach "Dictionaryの値をforeachで変更する【C#】")


##アルファベット26個(A-Z)を全文字書くことなく配列にして取得、使用する方法

アルファベットを使用して文字の処理、カウント等を行いたい場合にAからZまでの全てのアルファベットを書かなくてもLinqのクラスのEnamerableを使用して実現することができる

```C#:qiita.cs
using System;
using System.Linq;

namespace for_Qiita_proj
{
    class Program
    {
        static void Main(string[] args)
        {
            var alphabets = Enumerable.Range('A', 26)
                                    .Select((num) => ((char)num).ToString())
                                    .ToList();

            for (int i = 0; i < alphabets.Count; i++)
            {
                Console.WriteLine("{0}番目: {1}", i+1, alphabets[i]);
            }
        }

    }
}
      //出力結果
      //1番目: A
      //2番目: B
      //3番目: C
      //　||
      //　略
      //　||
      //24番目: X
      //25番目: Y
      //26番目: Z
```
参照サイト:[アルファベットの文字の配列を生成する](https://www.it-swarm-ja.tech/ja/c%23/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88%E3%81%AE%E6%96%87%E5%AD%97%E3%81%AE%E9%85%8D%E5%88%97%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/958061770/ "アルファベットの文字の配列を生成する")



##配列内の重複要素の数を取得する
特定の要素を配列内に格納していった際に、その要素の合計数を取得したい場合に使用するメソッド。


```C#:qiita.cs
using System;
using System.Linq;

namespace for_Qiita_proj
{
   class Program
   {
         static void Main(string[] args)
        {
            //string[] line = new string[] {"a", "a", "a", "b", "c", "c"};
            bool[] line = new bool[] { true, true, true, false, false };

            //distinctメソッドにて、重複を省いたユニーク値の配列を用意。
            //(ex, ここではtrueとfalseの２種類のみ。　コメントアウトしている箇所だと、a,b,cの３種類のことを指す)
            var uniqArr = line.Distinct().ToArray();

            //元の配列について、要素別にカウントして出力
            foreach (var x in uniqArr)
            {
                 //uniqArrから元の配列の中の要素との重複をa == x の処理にて計算する
                Console.WriteLine(x + "=>" + line.Count(a => a == x));
            }

            Console.ReadKey();
        }
   }
}
// 出力結果
// True => 3
// False => 2
```
参照サイト:[配列の要素別カウント](
http://moefeather.net/programming/2826/ "配列の要素別カウント")


##配列長を取得
2次限配列以上の内容だと明示的に配列の何次元目なのかを示す必要あり

```C#:qiita.cs
using System;

namespace for_Qiita_proj
{
   class Program
   {
      static void Main(string[] args)
      {
         var strArray = new string[7, 2] 
         { 
            { "Tokyo", "１３５１" },
            { "Aichi", "７４８３" }, 
            { "Osaka", "883" }, 
            { "Fukuoka", "510" }, 
            { "Hokkaido", "538" }, 
            { "Kyoto", "261" }, 
            { "Okinawa", "143" }
         };
         
         // .GetLength(1)の場合は 2 が取得できる
         int N = strArray.GetLength (0);
         Console.WriteLine("N = {0}", N);
      }
   }
}
// 出力結果
// N = 7

```