C#のコレクションについて

**著者：桂素偉&emsp;翻訳者：欧Lily もし誤りがございましたらご指摘いただければ幸いです**
&emsp;&emsp;C#には、List<T>、Dictionary<TKey,TValue>など、多くのコレクションがあります。これらは一般的に使用されますが、他にあまり使われないコレクションもあります。例えば、特性種類のコレクション:ReadOnly、Sort。特定アルゴリズムがあるコレクション:Queue<T>(先入れ先出し)、Stack<T>(後入れ先出し)、LinkedList<T>(個々のノードは前後のノードを互いに参照する)、これらのコレクションは、その特性によって適する用途が限られています。

####  読み取り専用のコレクション
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538010/10dc218a-e616-b4d2-b4c6-b410667a6ec0.png)


```C#
            /// <summary>
	        /// 読み取り専用List
	        /// </summary>
	        static void ReadOnlyListTest()
	        {
	            IReadOnlyList<string> readOnlyList = new List<string>() { "a", "b", "c" };
	            foreach (var item in readOnlyList)
	            {
	                Console.WriteLine(item);
	            }
	            /*出力結果
	             A
	             B
	             C
	             */
	        }
	        /// <summary>
	        ///読み取り専用Dictionary
	        /// </summary>
	        static void ReadOnlyDictionaryTest()
	        {
	            var readOnlyDictionary = new ReadOnlyDictionary<int, string>(
	                new Dictionary<int, string>
	                {
	                    {5,"apple"},
	                    {1,"grape"},
	                    {10, "peach"}
	                });
	

	            foreach (var item in readOnlyDictionary)
	            {
	                Console.WriteLine($"{item.Key}~{item.Value}");
	            }
	            /*出力結果
	             5~apple
	             1~grape
	             10~peach
	             */
	        }
```

####ソートコレクション
 
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538010/0f65dcf6-43ff-0fba-9968-e7b4cda22781.png)

```C#
            /// <summary>
	        /// SortedList
	        /// </summary>
	        static void SortListTest()
	        {
	            var sortList = new SortedList<int, string>();
	            sortList.Add(10, "peach");
	            sortList.Add(5, "apple");
	            sortList.Add(1, "grape");
	            Console.WriteLine(sortList.Keys);
	            foreach (var item in sortList)
	            {
	                Console.WriteLine($"{item.Key}~{item.Value}");
	            }
	            /*出力結果
	             1~grape
	             5~apple
	             10~peach
	             */
	        }
	        /// <summary>
	        /// SortedDictionary
	        /// </summary>
	        static void SortDictionaryTest()
	        {
	            var sortDic = new SortedDictionary<int, string>();
	            sortDic.Add(10, "peach");
	            sortDic.Add(5, "apple");
	            sortDic.Add(1, "grape");
	            Console.WriteLine(sortDic.Keys);
	            foreach (var item in sortDic)
	            {
	                Console.WriteLine($"{item.Key}~{item.Value}");
	            }
	            /*出力結果
	             1~grape
	             5~apple
	             10~peach
	            */
	        }
	        /// <summary>
	        /// SortedSet、要素が重複できない
	        /// </summary>
	        static void SortSetTest()
	        {
	            var sortSet = new SortedSet<int>();
	            sortSet.Add(10);
	            sortSet.Add(5);
	            sortSet.Add(1);
	            sortSet.Add(1);
	            foreach (var item in sortSet)
	            {
	                Console.WriteLine(item);
	            }
	            /*出力結果
	             1
	             5
	             10
	            */
	        }
```
#### 要素アクセス特性コレクション
 
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538010/0d717d04-2ea1-5556-aadf-5e153dbd9165.png)

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538010/be904abc-c06e-1f0b-00b3-6d9d627aef63.png)

![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538010/5a26c960-d6e3-9a98-e9e1-7e8ec98624ad.png)

```C#
            /// <summary>
	        /// LinkedList：双方向の連結リストのデータ構造
	        /// </summary>
	        static void LinkedListTest()
	        {
	            var linkedList = new LinkedList<string>();
	            linkedList.AddLast("2");
	            linkedList.AddLast("3");
	            linkedList.AddLast("5");	

	            linkedList.AddFirst("1");	

	            linkedList.AddBefore(linkedList.Find("5"), "4");
	            foreach (var item in linkedList)
	            {
	                Console.WriteLine(item);
	            }

	            Console.WriteLine($"2前の値:{linkedList.Find("2").Previous.Value}");
	            Console.WriteLine($"2後の値:{linkedList.Find("2").Next.Value}");

	            /*出力結果
	             1
	             2
	             3
	             4
	             5
	             2前の値:1
	             2後の値:3
	             */
	        }
	        /// <summary>
	        /// HashSet: 要素が重複できない
	        /// </summary>
	        static void HashSetTest()
	        {
	            var hashSet = new HashSet<string>();
	            hashSet.Add("a");
	            hashSet.Add("c");
	            hashSet.Add("b");
	            hashSet.Add("a");
	            hashSet.Add("c");
	            hashSet.Add("b");
	            foreach (var item in hashSet)
	            {
	                Console.WriteLine(item);
	            }
	            /*出力結果
	             a
	             b
	             c
	             */
	        }
	        /// <summary>
	        ///待ち行列:先入れ先出し
	        /// </summary>
	        static void QueueTest()
	        {
	            var queue = new Queue<int>();
	            queue.Enqueue(1);
	            queue.Enqueue(2);
	            queue.Enqueue(3);
	            foreach (var item in queue)
	            {
	                Console.WriteLine(item);
	            }
	            Console.WriteLine($"dequeue要素：{queue.Dequeue()}");
	            /*出力結果
	             1
	             2
	             3
	             dequeue要素：1
	             */
	        }
	        /// <summary>
	        /// スタック: 後入れ先出し
	        /// </summary>
	        static void StackTest()
	        {
	            var stack = new Stack<int>();
	            stack.Push(1);
	            stack.Push(2);
	            stack.Push(3);
	            foreach (var item in stack)
	            {
	                Console.WriteLine(item);
	            }
	            //pop要素
	            Console.WriteLine($"pop要素:{stack.Pop()}");
	            /*出力結果
	             3
	             2
	             1
	             pop要素：3
	             */
	        }