はじめに
先日業務にて、表題の件について調査したので共有します。
配列とリストの違い
-
配列
宣言時に静的なメモリ確保を行うため、要素数の変更は行うことができない
※1次元配列であれば Array.Resize メソッドにより要素数の変更はできる -
リスト
動的なメモリ確保を行うため、要素の追加や削除を柔軟に行うことができる
配列とリストの使い分け
配列とリストの違いからもわかるように、要素数が決まっている場合は配列を使用し、要素数が動的に変化する場合はリストを使用すると良いかと思います。また、より汎用的なプログラムを作りたいのであれば、リストを使用すると良いのではないでしょうか。
が、、
どうやら、
C# で多次元リストを宣言するための組み込みメソッドはありません。
だそうです。。
そこで、本投稿にて要素数が動的に変化するデータを2次元で扱う方法について解説します。
本題
C# で2次元リストを扱いたい場合、
リストを入れ子にして多重に定義することで実現できます。
下記は二次元リストの例(T には任意のデータ型を指定)
List<List<T>>
使用例
List<List<int>> Data = new List<List<int>>();
for (int i=0; i<3; i++)
{
List<int> Items = new List<int>();
Items.Add(i);
Items.Add(i+3);
Items.Add(i*i);
Data.Add(Items);
}
Dataリストの中身
Items[0] | Itams[1] | Items[2] | |
---|---|---|---|
Data[0][n] | 0 | 3 | 0 |
Data[1][n] | 1 | 4 | 1 |
Data[2][n] | 2 | 5 | 4 |
ちなみに
上記の方法では1種類のデータ型のみ(例では int 型)指定できますが、下記の方法では様々なデータ型を指定できます。
クラスのリストとして2次元を表現する
public class Member
{
public long Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
List<Member> Group = new List<Member>();
for (int i=0; i<3; i++)
{
Member m = new Member();
m.Id = i;
m.Name = "anyName";
m.Age = i + 20;
Group.Add(m);
}
Groupリストの中身
Id | Name | Age | |
---|---|---|---|
Group[0] | 0 | anyName | 20 |
Group[1] | 1 | anyName | 21 |
Group[2] | 2 | anyName | 22 |
タプルのリストとして2次元を表現する
var Group = new List<(long Id, string Name, int Age)>();
for (int i=0; i<3; i++)
{
Group.Add((i, "anyName", i + 20));
}
Groupリストの中身
Id | Name | Age | |
---|---|---|---|
Group[0] | 0 | anyName | 20 |
Group[1] | 1 | anyName | 21 |
Group[2] | 2 | anyName | 22 |
クラスを定義しない分コード量は少なくなりますね。
結論
本投稿では表題の件に対して3種類の実現方法を提示しましたが、特別な条件がない場合は可読性や保守性の観点から、2種類目のクラスのリストを使用するのが最適かと思います。
おわりに
今回は私自身が実務で躓いたことについて共有させていただきました。
同じように躓いている方のお力になれれば幸いです。
最後までお読みいただきありがとうございました。
また逢う日まで。
参考文献