解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

C# の 2次元配列みたいな List のソート



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


前の記事で 2次元配列みたいに Listを使ってみましたが、使い勝手が良く、いっぱい使っていたらソートしたくなったので、ソート方法を調べました。

C# の List の 2次元配列みたいな使い方 - 解析エンジニアの自動化 blog



動作環境


Windows 7
Visual Studio 2017



プログラム

List は 多次元的に使用するとソート出来なくなります。

今回は要素数が全て同じ List を前提にしています。

( List のいいところが無くなりそうですが…)

ソースコードは下の①〜④のような構成で書きました。
① List を作成
② ジャグ配列に変換
③ ジャグ配列のソート
④ List に変換

ソースコード


using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
namespace List_How_to_use
{
    class Program
    {
        static void Main(string[] args)
        {
            //-----------------------------------------------------------------------------------
            Console.WriteLine(""); // 1行空けて
            Console.WriteLine(" List を作成して表示");
            //-----------------------------------------------------------------------------------
           
            // 2 次元配列のように扱える List の定義
            var varList = new List<List<int>>();
 
            // 代入する要素の作成用変数
            int calc = 0;
 
            // List に要素を代入する
            for (int i = 0; i < 10; i++)
            {
                // i 行目の要素に List を作成する
                varList.Add(new List<int>());
 
                // i 行目の要素を作成・追加する
                for (int j = 0; j < 10; j++)
                {
                    // 要素の作成
                    calc = (10 - i) * (10 - j);
 
                    // 要素の追加
                    varList[i].Add(calc);
                }
            }
 
            // 出力( 10 × 10 の数値が表示される)
            // i 行目のループ
            for (int i = 0; i < varList.Count; i++)
            {
                // j 列目のループ
                for (int j = 0; j < varList[i].Count; j++)
                {
                    // j 列目が最後の要素なら
                    if (j + 1 == varList[i].Count)
                    {
                        // 末尾改行あり出力
                        Console.WriteLine(string.Format("{0, 4}", varList[i][j]));
                    }
                    // j 列目が最後の要素では無いなら
                    else
                    {
                        // 末尾改行なし出力
                        Console.Write(string.Format("{0, 4}", varList[i][j]));
                    }
                }
            }
 
            //-----------------------------------------------------------------------------------
            Console.WriteLine(""); // 1行空けて
            Console.WriteLine(" List をジャグ配列に変換して表示");
            //-----------------------------------------------------------------------------------
 
            // List をジャグ配列に変換する
            var varArray = varList.Select(line => line)
                                  .Select(line_child => line_child.ToArray())
                                  .ToArray();
 
            // 出力( 10 × 10 の数値が表示される)
            for (int i = 0; i < varArray.Length; i++)
            {
                for(int j=0; j < varArray[i].Length; j++)
                {
                    // j 列目が最後の要素なら
                    if (j + 1 == varArray[i].Length)
                    {
                        // 末尾改行あり出力
                        Console.WriteLine(string.Format("{0, 4}", varArray[i][j]));
                    }
                    // j 列目が最後の要素では無いなら
                    else
                    {
                        // 末尾改行なし出力
                        Console.Write(string.Format("{0, 4}", varArray[i][j]));
                    }
                }
            }
 
            //-----------------------------------------------------------------------------------
            Console.WriteLine(""); // 1行空けて
            Console.WriteLine(" ジャグ配列をソートして表示");
            //-----------------------------------------------------------------------------------
 
            // ジャグ配列をソートする(要素数が全て同じであることが前提)
            Array.Sort(varArray, StructuralComparisons.StructuralComparer);
 
            // 出力( 10 × 10 の数値が表示される)
            for (int i = 0; i < varArray.Length; i++)
            {
                for (int j = 0; j < varArray[i].Length; j++)
                {
                    // j 列目が最後の要素なら
                    if (j + 1 == varArray[i].Length)
                    {
                        // 末尾改行あり出力
                        Console.WriteLine(string.Format("{0, 4}", varArray[i][j]));
                    }
                    // j 列目が最後の要素では無いなら
                    else
                    {
                        // 末尾改行なし出力
                        Console.Write(string.Format("{0, 4}", varArray[i][j]));
                    }
                }
            }
 
           //-----------------------------------------------------------------------------------
            Console.WriteLine(""); // 1行空けて
            Console.WriteLine(" ジャグ配列を List に変換して表示");
            //-----------------------------------------------------------------------------------
 
            // リストに変換する
            List<List<int>> iList = varArray.Select(line => line)
                                            .Select(line_child => line_child.ToList())
                                            .ToList();
 
            // 出力( 10 × 10 の数値が表示される)
            // i 行目のループ
            for (int i = 0; i < iList.Count; i++)
            {
                // j 列目のループ
                for (int j = 0; j < iList[i].Count; j++)
                {
                    // j 列目が最後の要素なら
                    if (j + 1 == iList[i].Count)
                    {
                        // 末尾改行あり出力
                        Console.WriteLine(string.Format("{0, 4}", iList[i][j]));
                    }
                    // j 列目が最後の要素では無いなら
                    else
                    {
                        // 末尾改行なし出力
                        Console.Write(string.Format("{0, 4}", iList[i][j]));
                    }
                }
            }
 
            // 何かキーが押されるまで待つ
            Console.ReadKey();
        }
    }
}



結果

2次元配列みたいな List のソートが出来ました。

図1 出力結果



コメント

LINQ も良いですね。

LINQ 分かりやすくは無かったですが、便利すぎです。



以上