【C#入門】Listの使い方について｜要素の追加・削除、ソート、検索

>この記事では、《SQL Server のストアドプロシージャ》について、
業務を通して学習した内容を、備忘録としてまとめています。

- __『List』とは…？__
- __『List』の要素の追加・削除する方法__
- __『List』をソート・検索する方法__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

## 『List』&ensp;とは…？

![list_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/71a45aa3-b9d8-8281-363b-fd5535a712c5.jpeg)

『List』とは・・・

__同じデータ型の値をまとめて取り扱うためのクラス__です。

『List』は配列と異なり、簡単に要素を追加・削除することができるメソッドが用意されているので…

要素数が変化する場合には、『List』を使用します。

>C#では、配列のようなデータ構造に対して、途中でデータを追加・削除したい場合にList<T>クラスを使用します。

## 『List』&ensp;の基本的な使い方

まず、使用する際は下記を記述します。

~~~cs
using System;
using System.Collections.Generic;
~~~

### 『List』&ensp;の宣言・初期化について

~~~program.cs
using System;
using System.Collections.Generic;

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

            // int型を格納するリストを宣言
            var intlist = new List<int>();

            // 初期化した際の初期値を指定する場合は、以下のように宣言
            var number = new List<int>()
            {
                10, 20, 30, 40, 50, 60, 70, 80, 90, 100
            };

            // string型を格納するリストを宣言
            var strList = new List<string>()
            {
                "hoge", "hogehoge"
            };
        }
    }
}
~~~

### 『List』&ensp;の要素へのアクセス方法

~~~cs
// 配列のように添え字でアクセスできます
int item = list[1];
~~~

実際に動かしてみます。

~~~program.cs
using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var sampleList = new List<string>()
            {
                "hoge", "hogehoge"
            };

            Console.WriteLine(sampleList[1]);
        }
    }
}
~~~

実行結果：

~~~
hogehoge
~~~

### 『List』&ensp;の要素を全部取り出す

~~~cs
var sampleList = new List<string>()
    {
        "hoge", "hogehoge"
    };

    foreach (var str in sampleList)
    {
        Console.WriteLine(str);
    }
~~~

実際に動かしてみます。

~~~program.cs
using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var sampleList = new List<string>()
            {
                "hoge", "hogehoge"
            };

            foreach (var str in sampleList)
            {
                Console.WriteLine(str);
            }
        }
    }
}
~~~

実行結果：

~~~
hoge
hogehoge
~~~

## 『List』&ensp;と&ensp;『ArrayList』&ensp;の違いは…？

![list_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/5a4892f0-ac44-b8a4-2cb0-8032ffa40f1c.jpeg)

ここでは、__『List』と『ArrayList』の違い__を解説します。

『List』は…

__指定したデータ型の要素しか格納できませんが、要素を取り出すときにキャストをする必要がありません。__

そのため・・・

__データ型があらかじめ決まっている場合には、『List』を使う方が便利__です。

反対に、『ArrayList』は…

__異なるデータ型を格納することができますが、要素を取り出すときにキャストする必要があり、コードの記述に手間がかかります。__

>基本的には、『ArrayList』よりも『List』の方が使いやすいので、『List』を使用すれば大丈夫かと思います。

## 『List』&ensp;の要素の追加・削除する方法｜`Add`/`Remove`

### 『List』&ensp;の要素の追加｜`Add`メソッド

ここでは・・・

『List』に要素を追加する方法を解説します。

『List』に要素を追加するには、`Add`メソッドを使います。

`Add`メソッドは、下記のように使用します。

~~~program.cs
using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var sampleList = new List<string>();

            sampleList.Add("hoge");
            sampleList.Add("hogehoge");

            foreach (var str in sampleList)
            {
                Console.WriteLine(str);
            }
        }
    }
}
~~~

実行結果：

~~~
hoge
hogehoge
~~~

### 『List』&ensp;の要素の削除｜`Remove`メソッド

ここでは・・・

『List』の要素を削除する方法を解説します。

『List』の要素を削除するには、`Remove`メソッドを使います。

`Remove`メソッドは、下記のように使用します。

~~~program.cs
using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var sampleList = new List<string>();

            sampleList.Add("hoge");
            sampleList.Add("hogehoge");

            sampleList.Remove("hogehoge");

            foreach (var str in sampleList)
            {
                Console.WriteLine(str);
            }
        }
    }
}
~~~

実行結果：

~~~
hoge
~~~

## 『List』&ensp;を並び替え（ソート）する方法｜`OrderBy`メソッド

ここでは・・・

『List』をソートする方法を解説します。

『List』をソートするには、LINQ拡張の`OrderBy`メソッドを使います。

`OrderBy`メソッドは、下記のように使用します。

~~~program.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List<int>()
            {
                20, 10, 40, 30, 60, 50, 80, 70, 100, 90
            };

            var orderedNumber = number.OrderBy(x => x) //.OrderByDescending(x => x)

            foreach (var num in orderedNumber)
            {
                Console.WriteLine(num);
            }
        }
    }
}
~~~

## 『List』&ensp;を検索する方法｜`Where`メソッド、`Contains`メソッド

『List』の要素を検索して、目的の要素を探すにはいくつかの方法がありますが…

通常は、LINQ拡張を使えばいいです。

ただし・・・

要素数が多く、かつ、要素が昇順に並んでいるときに特定の要素を検索する場合は、

List<T>クラスの`BinarySearch`メソッドが高速です。

また・・・

要素が含まれているどうかを判定するには、List<T>クラスの`Contains`メソッドを使用します。

### `Where`メソッド｜条件を指定して要素を検索する

『List』の要素を検索して、条件に一致する要素を取得するには、LINQ拡張の`Where`メソッドを使います。

`Where `メソッドは、下記のように使用します。

~~~program.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List<int>()
            {
                10, 20, 30, 40, 50, 60, 70, 80, 90, 100
            };

            var selectedNumber = number.Where(x => x > 50);

            foreach (var num in selectedNumber)
            {
                Console.WriteLine(num);
            }
        }
    }
}
~~~

実行結果：

~~~
60
70
80
90
100
~~~

### `Contains`メソッド｜指定した値が含まれるか判定する

『List』の要素を検索して値が含まれるかどうかを判定するには、List<T>クラス`Contains`メソッドを使います。

`Contains`メソッドは、下記のように使用します。

~~~program.cs
using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var sampleList = new List<string>();
            sampleList.Add("hoge");
            sampleList.Add("hogehoge");

            string item = "hogehoge";

            if (sampleList.Contains(item))
            {
                Console.WriteLine("{0}が見つかりました", item);
            }
            else
            {
                Console.WriteLine("{0}は見つかりませんでした", item);
            }

            foreach (var str in sampleList)
            {
                Console.WriteLine(str);
            }
        }
    }
}
~~~

実行結果：

~~~
hogehogeが見つかりました
hoge
hogehoge
~~~