配列とコレクション (Visual C# Express)
更新 : 2007 年 11 月
関連するデータ項目をグループとして格納することは、ほとんどのソフトウェア アプリケーションの基本要件です。これを行うには主に 2 つの方法があり、1 つは配列を使用する方法、もう 1 つはコレクションを使用する方法です。
配列
配列は、同じ型のオブジェクトのコレクションです。配列は、ほとんど任意の長さに設定できるため、非常に多くのオブジェクトを格納できますが、そのサイズは配列の作成時に決める必要があります。配列内の各項目には、インデックスを使用してアクセスします。インデックスは、オブジェクトが格納されている配列内の位置またはスロットを示す単なる数値です。配列では、参照型も値型も格納できます。
1 次元配列
配列とは、インデックス付きオブジェクトのコレクションです。オブジェクトの 1 次元配列は次のように宣言されます。
type[] arrayName;
次のように、配列の要素を同時に初期化することもよくあります。
int[] array = new int[5];
数値配列要素の既定値は 0、参照要素の既定値は null ですが、配列の作成時に値を次のように初期化できます。
int[] array1 = new int[] { 1, 3, 5, 7, 9 };
または、次のようにも初期化できます。
int[] array2 = {1, 3, 5, 7, 9};
配列では 0 から始まるインデックスが使用されるので、配列内の 1 番目の要素は要素 0 になります。
string[] days = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
System.Console.WriteLine(days[0]); // Outputs "Sun"
多次元配列
概念的には、2 次元の多次元配列はグリッドに似ています。3 次元の多次元配列はキューブに似ています。
// declare multidimension array (two dimensions)
int[,] array2D = new int[2,3];
// declare and initialize multidimension array
int[,] array2D2 = { {1, 2, 3}, {4, 5, 6} };
// write elements in a multidimensional array
for (int i=0; i<2; i++)
{
for (int j=0; j<3; j++)
{
array2D[i,j] = (i + 1) * (j + 1);
}
}
// read elements in a multidimensional array
for (int i=0; i<2; i++)
{
for (int j=0; j<3; j++)
{
System.Console.Write(array2D[i,j]);
}
System.Console.WriteLine();
}
ジャグ配列
ジャグ配列は配列の配列であり、多次元配列の一種です。ジャグ配列は 1 次元配列であり、各要素が配列になっています。各要素配列のサイズが同一である必要はありません。
ジャグ配列は次のように宣言します。
int[][] jaggedArray = new int[3][];
これにより、3 つの配列から成る配列が作成されます。これらの配列は、次のように初期化できます。
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
foreach ステートメントの使用
foreach ステートメントは、配列に格納されている各要素にアクセスするときによく使用されます。
int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
System.Console.Write("{0} ", i);
}
//Output: 4 5 6 1 2 3 -2 -1 0
オブジェクトの配列
整数などの単純なデータ型の配列ではなく、オブジェクト配列を作成する手順は 2 段階で行います。最初に配列を宣言し、次にこの配列に格納するオブジェクトを作成します。この例では、オーディオ CD を定義するクラスを作成します。次に、20 個のオーディオ CD を格納する配列を作成します。
namespace CDCollection
{
// Define a CD type.
class CD
{
private string album;
private string artist;
private int rating;
public string Album
{
get {return album;}
set {album = value;}
}
public string Artist
{
get {return artist;}
set {artist = value;}
}
public int Rating
{
get {return rating;}
set {rating = value;}
}
}
class Program
{
static void Main(string[] args)
{
// Create the array to store the CDs.
CD[] cdLibrary = new CD[20];
// Populate the CD library with CD objects.
for (int i=0; i<20; i++)
{
cdLibrary[i] = new CD();
}
// Assign details to the first album.
cdLibrary[0].Album = "See";
cdLibrary[0].Artist = "The Sharp Band";
cdLibrary[0].Rating = 10;
}
}
}
コレクション
配列は、C# でデータ セットを格納するための多くのオプションのうちの 1 つにすぎません。選択するオプションは、項目の操作方法や項目へのアクセス方法など、いくつかの要因によって異なります。たとえば、コレクションの先頭や中間に項目を挿入する必要がある場合は、一般に配列よりもリストの方が高速です。コレクション クラスの種類としては他に、マップ、ツリー、スタックなどがあり、それぞれ固有の長所があります。詳細については、「System.Collections」および「System.Collections.Generic」を参照してください。
List<T> クラスを使用する方法の例を次に示します。Array クラスと違って、項目をリストの中間に挿入できます。この例では、リスト内の項目は文字列に制限されています。
public class TestCollections
{
public static void TestList()
{
System.Collections.Generic.List<string> sandwich = new System.Collections.Generic.List<string>();
sandwich.Add("bacon");
sandwich.Add("tomato");
sandwich.Insert(1, "lettuce");
foreach (string ingredient in sandwich)
{
System.Console.WriteLine(ingredient);
}
}
}
参照
処理手順
方法 : メソッドにオブジェクト配列を渡す (Visual C#)
方法 : コレクションを反復処理する (Visual C#)