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();
}
}
}
以上