配列やリストの操作

C#の配列は、同じ型の要素が連続したメモリ領域に格納された固定長のデータ構造です。 配列を宣言する際には、要素の型と配列のサイズを指定します。 一方、リストは可変長の要素を持つ動的なデータ構造で、要素の追加・削除などを簡単に行えます。 配列と違ってサイズを動的に変更できるので柔軟に利用できます。今回は配列やリストを扱うプログラムにポンコツ2人組が挑戦します!

※この記事は2023/12/07時点の情報です。

Program.cs
下記の処理を行うサンプルプログラムです。
■配列・リスト・マップを作成して初期化し、要素にアクセスするサンプル
■配列・リストをソートするサンプル
■リストの要素を入れ替えるサンプル

using System;
using System.Collections.Generic;
using System.Linq;

namespace ArraySample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ 配列(Array)の例");
            Console.WriteLine("--------------------------------------");

            // 配列を作成して初期化
            int[] numbers = { 1, 2, 3, 4, 5 };

            // 配列の要素にアクセスして表示
            for (int i = 0; i < numbers.Length; i++)
            {
                Console.WriteLine($"配列の要素 {i}: {numbers[i]}");
            }

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ リスト(List)の例");
            Console.WriteLine("--------------------------------------");

            // リストを作成して初期化
            List<string> fruits = new List<string>();
            fruits.Add("りんご");
            fruits.Add("バナナ");
            fruits.Add("オレンジ");

            // リストの要素にアクセスして表示
            foreach (var fruit in fruits)
            {
                Console.WriteLine($"フルーツ: {fruit}");
            }

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ マップ(Dictionary)の例");
            Console.WriteLine("--------------------------------------");

            // マップを作成して初期化
            Dictionary<string, int> price = new Dictionary<string, int>();
            price.Add("大人", 3000);
            price.Add("小人", 1500);
            price.Add("シニア", 1000);

            // マップの要素にアクセスして表示
            foreach (var pair in price)
            {
                Console.WriteLine($"{pair.Key} の価格: {pair.Value}");
            }

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ 2次元配列のソート");
            Console.WriteLine("--------------------------------------");

            // 2次元配列の作成と初期化
            int[,] matrix = {
                { 5, 4, 3 },
                { 9, 8, 7 },
                { 2, 1, 6 }
            };

            // 2次元配列の内容を表示
            Console.WriteLine("ソート前の2次元配列:");
            PrintMatrix(matrix);

            // LINQ の orderby を使ったソート(例として、各行の先頭要素でソート)
            var sortedMatrix = Enumerable.Range(0, matrix.GetLength(0))
                .OrderBy(row => matrix[row, 0])
                .Select(row => Enumerable.Range(0, matrix.GetLength(1)).Select(col => matrix[row, col]).ToArray())
                .ToArray();

            // ソート後の2次元配列の内容を表示
            Console.WriteLine("\nソート後の2次元配列:");
            PrintMatrix(sortedMatrix);

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ 第1優先と第2優先を指定したソート");
            Console.WriteLine("--------------------------------------");

            // Tupleのリストの作成と初期化
            List<Tuple<int, int>> points = new List<Tuple<int, int>>
            {
                Tuple.Create(5, 10),
                Tuple.Create(3, 8),
                Tuple.Create(5, 7),
                Tuple.Create(3, 6),
                Tuple.Create(7, 9)
            };

            // ソート前のリストの表示
            Console.WriteLine("ソート前のリスト:");
            PrintList(points);

            // 要素xの降順、要素yの降順でリストをソート
            var sortedPoints = points.OrderByDescending(p => p.Item1).ThenByDescending(p => p.Item2).ToList();

            // ソート後のリストの表示
            Console.WriteLine("\nソート後のリスト:");
            PrintList(sortedPoints);

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ Array.Sortを使った配列のソート");
            Console.WriteLine("--------------------------------------");

            // 配列の作成と初期化
            int[] numbers2 = { 5, 2, 8, 1, 6 };

            // ソート前の配列の表示
            Console.WriteLine("ソート前の配列:");
            PrintArray(numbers2);

            // 配列のソート
            Array.Sort(numbers2);

            // ソート後の配列の表示
            Console.WriteLine("\nソート後の配列:");
            PrintArray(numbers2);

            Console.WriteLine("--------------------------------------");
            Console.WriteLine("■ リストの要素を入れ替え");
            Console.WriteLine("--------------------------------------");

            // リストの作成と初期化
            List<int> numbers3 = new List<int> { 5, 2, 8, 1, 6 };

            // 入れ替え前のリストの表示
            Console.WriteLine("入れ替え前のリスト:");
            PrintList(numbers3);

            // リストの要素を入れ替え
            SwapElements(numbers3, 1, 3); // 1番目と3番目の要素を入れ替え

            // 入れ替え後のリストの表示
            Console.WriteLine("\n入れ替え後のリスト:");
            PrintList(numbers3);

            Console.WriteLine("--------------------------------------");
        }

        // 2次元配列の内容を表示するヘルパーメソッド
        static void PrintMatrix(int[,] matrix)
        {
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    Console.Write(matrix[i, j] + "\t");
                }
                Console.WriteLine();
            }
        }

        // ソート後の2次元配列の内容を表示するヘルパーメソッド
        static void PrintMatrix(int[][] matrix)
        {
            foreach (var row in matrix)
            {
                foreach (var element in row)
                {
                    Console.Write(element + "\t");
                }
                Console.WriteLine();
            }
        }

        // 配列の内容を表示するヘルパーメソッド
        static void PrintArray(int[] array)
        {
            foreach (var number in array)
            {
                Console.Write(number + " ");
            }
            Console.WriteLine();
        }

        // リストの内容を表示するヘルパーメソッド
        static void PrintList(List<int> list)
        {
            foreach (var number in list)
            {
                Console.Write(number + " ");
            }
            Console.WriteLine();
        }

        // Tupleのリストの内容を表示するヘルパーメソッド
        static void PrintList(List<Tuple<int, int>> list)
        {
            foreach (var point in list)
            {
                Console.WriteLine($"要素x: {point.Item1}, 要素y: {point.Item2}");
            }
        }

        // リストの要素を入れ替えるヘルパーメソッド
        static void SwapElements(List<int> list, int index1, int index2)
        {
            if (index1 >= 0 && index1 < list.Count && index2 >= 0 && index2 < list.Count)
            {
                int temp = list[index1];
                list[index1] = list[index2];
                list[index2] = temp;
            }
            else
            {
                Console.WriteLine("入れ替える要素のインデックスが範囲外です。");
            }
        }
    }
}

以下が実行した結果です。

--------------------------------------
■ 配列(Array)の例
--------------------------------------
配列の要素 0: 1
配列の要素 1: 2
配列の要素 2: 3
配列の要素 3: 4
配列の要素 4: 5
--------------------------------------
■ リスト(List)の例
--------------------------------------
フルーツ: りんご
フルーツ: バナナ
フルーツ: オレンジ
--------------------------------------
■ マップ(Dictionary)の例
--------------------------------------
大人 の価格: 3000
小人 の価格: 1500
シニア の価格: 1000
--------------------------------------
■ 2次元配列のソート
--------------------------------------
ソート前の2次元配列:
5 4 3
9 8 7
2 1 6

ソート後の2次元配列:
2 1 6
5 4 3
9 8 7
--------------------------------------
■ 第1優先と第2優先を指定したソート
--------------------------------------
ソート前のリスト:
要素x: 5, 要素y: 10
要素x: 3, 要素y: 8
要素x: 5, 要素y: 7
要素x: 3, 要素y: 6
要素x: 7, 要素y: 9

ソート後のリスト:
要素x: 7, 要素y: 9
要素x: 5, 要素y: 10
要素x: 5, 要素y: 7
要素x: 3, 要素y: 8
要素x: 3, 要素y: 6
--------------------------------------
■ Array.Sortを使った配列のソート
--------------------------------------
ソート前の配列:
5 2 8 1 6

ソート後の配列:
1 2 5 6 8
--------------------------------------
■ リストの要素を入れ替え
--------------------------------------
入れ替え前のリスト:
5 2 8 1 6

入れ替え後のリスト:
5 1 8 2 6
--------------------------------------

以上が今回の配列・リストを扱うサンプルプログラムになります。 配列やリストを使ったプログラムを書く機会はとても多いので使い方・書き方を覚えておきましょう。 今回の内容は理解できましたか?

C#の配列やリストを使ったプログラムを覚えられましたか?

あまり理解できなかった人は実際にプログラムを書いて実行し、感覚を掴んでみてください。 初心者には難しいかも知れませんが、頑張って勉強しましょう!

管理人情報