1.はじめに
2.配列とは
3.一次元配列
3-1.一次元配列の作り方
3-2.一次元配列の要素へのアクセス方法
3-3.配列の変更
3-3-1.要素の変更
3-3-2.配列の初期化
3-4.ループで一次元配列を処理する
3-5.Listクラス
①要素の追加
②要素の挿入
③要素の削除
【応用】Listを使って入力された複数データを処理する
4.多次元配列
4-1.二次元配列
4-1-1.二次元配列の作り方
4ー1ー2.二次元配列の要素へのアクセス方法
4ー1ー3.ループで二次元配列を処理する
4-2.三次元配列
4-2-1.三次元配列の作り方
4-2-2.三次元配列の要素へのアクセス方法
4-2-3.ループで三次元配列を処理する
5.配列と一緒に使うと便利なプロパティ・メソッド
5-1.Lengthプロパティ
5-2.Splitメソッド
5-3.string.Joinメソッド
5-4.Array.Resizeメソッド
6.まとめ
配列に苦戦するプログラミング初心者の方は多いのではないでしょうか。
しかし、配列には多くのメリットがあり、システム開発に大きく役立ちます。
この記事ではC#で配列の使い方を説明します。
なお、C#の概要については下記、当社の過去記事を参考にしてみてください。
本記事に記載のサンプルコードの実行環境はPaizaCloudを使用しており、コンパイラは下記が使用されています。
Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-2 Wed Feb 26 23:41:24 UTC 2020)
配列とは、同じ型の複数データをメモリ上連続的に並べたデータ構造です。
配列中の各データを配列の「要素」と呼び、「インデックス」と呼ばれる番号で識別します。
配列には下記のようなメリットがあります。
メリット
・プログラムが簡潔になる
・効率的に大量のデータを扱える
・メモリの利用効率が良くなる
など
主な使用例は「Excelのような表データ処理」です。
次項から詳しく配列の使い方を見ていきましょう。
一次元配列とは、下記のような一行に同一型の複数データを格納したデータ構造です。
配列名をarray、インデックスをiとすると、配列の各要素は下記のように表します。
array[0] | array[1] | array[2] | … | array[i] |
---|---|---|---|---|
要素1 | 要素2 | 要素3 | … | 要素i |
注意点
・配列の先頭の要素のインデックスは0です。
3-1.一次元配列の作り方
配列は宣言と初期化をすると作ることができます。
一次元配列を宣言するには下記のように記述します。
【構文】
データ型[] 配列名;
【サンプルコード】
//配列の宣言
int[] intArray;
string[] strArray;
次に一次元配列の初期化方法は複数あります。
ここでは3パターン紹介します。
①パターン1
【構文】
データ型[] 配列名 = new データ型[要素数];
配列名[0] = 値;
配列名[1] = 値;
…
【サンプルコード】
string[] array = new string[3];
array[0] = "株式会社";
array[1] = "NEXT";
array[2] = "TECHNOLOGY";
②パターン2
【構文】
データ型[] 配列名 = new データ型[要素数][要素1,要素2,要素3...];
【サンプルコード】
string[] array = new string[3] {"株式会社","NEXT","TECHNOLOGY"};
③パターン3
配列の長さは{}に指定した要素数となります。
【構文】
データ型[] 配列名 = [要素1,要素2,要素3...];
【サンプルコード】
string[] array = {"株式会社","NEXT","TECHNOLOGY"};
3-2.一次元配列の要素へのアクセス方法
一次元配列の各要素へアクセスするためには下記のように表します。
配列名[インデックス番号]
下記は3-1で作成した配列の要素を出力するコードです。
繰り返しとなりますが、注意点は配列の先頭の要素のインデックスは0である点です。
3-1のいずれのパターンで配列を作成しても出力結果は同じです。
【サンプルコード】
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
【出力結果】
株式会社
NEXT
TECHNOLOGY
3-3.配列の変更
3-3-1.要素の変更
配列の各要素の値は変更したい値を代入すると変更できます。
【サンプルコード】
//配列作成
string array[3] = {"株式会社", "NEXT", "TECHNOLOGY"};
//変更値の代入
array[1] = "ネクスト";
array[2] = "テクノロジー";
//出力
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
【出力結果】
株式会社
ネクスト
テクノロジー
3-3-2.配列の初期化
配列はnewを使って初期化し再定義することができます。
//配列作成
string[] array = new string[3] {"株式会社","NEXT","TECHNOLOGY"};
//配列初期化
array = new string[2];
array[0] = "ネクスト";
array[1] = "テクノロジー";
//出力
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
【出力結果】
ネクスト
テクノロジー
3-4.ループで一次元配列を処理する
配列は、ループと組み合わせると効率よくデータを処理することができます。
ここではforとforeachを使って一次元配列の各要素を表示するサンプルコードを紹介します。
なお、forループ処理で使用するLengthプロパティについてはこちらをご確認ください。
【for】
using System;
using System.Collections;
public class Sample{
public static void Main(){
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};
//要素数分ループ
for(int i = 0; i array.Length; i++){
//該当要素の出力
Console.WriteLine(array[i]);
}
}
}
【foreach】
using System;
using System.Collections;
public class Sample{
public static void Main(){
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};
//要素数分ループ
foreach (string arr in array){
//該当要素の出力
Console.WriteLine(arr);
}
}
}
【出力結果】
出力結果はfor、foreachどちらも同じです。
株式会社
NEXT
TECHNOLOGY
3-5.Listクラス
Listは、順序付けられた同じデータ型の要素の集合を管理するコレクションのクラスで、配列のような使い方ができます。
配列とコレクションには下記のような違いがあります。
配列 | コレクション | |
---|---|---|
要素数 | 固定 | 可変 |
使用メモリ | 少ない | 多い |
コレクションについて詳しくは下記をご参照ください。
Listは要素数が可変なため、標準入力から受け取った値など、要素数が不定なデータの処理に便利です。
Listクラスを使うには下記の名前空間を使用します。
using System.Collections.Generic;
リストオブジェクトの作り方は下記の通りです。
// List オブジェクト名 = new List();
Listint> lst = new Listint>(); //intの場合
Liststring> lst = new Liststring>(); //stringの場合
リストの要素にはメソッドを使って下記のような操作ができます。
①要素の追加
②要素の挿入
③要素の削除
①要素の追加
Addメソッドを使います。
【構文】
リスト変数.Add(追加したい要素);
【サンプルコード】
//リスト作成
Liststring> lst = new Liststring>();
//要素の追加
lst.Add("株式会社");
lst.Add("NEXT");
lst.Add("TECHNOLOGY");
//リストの出力
foreach(string elmnt in lst){
Console.WriteLine(elmnt);
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
②要素の挿入
Insertメソッドを使用します。
リストの指定した位置にデータを挿入することができます。
【構文】
リスト変数.Insert(挿入位置,挿入値);
【サンプルコード】
//リスト作成
Liststring> lst = new Liststring>();
//要素の追加
lst.Add("株式会社");
lst.Add("TECHNOLOGY");
//要素の挿入
lst.Insert(1,"NEXT");
//リストの出力
foreach(string elmnt in lst){
Console.WriteLine(elmnt);
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
③要素の削除
Removeメソッドを使います。
指定した要素を削除することができます。
【構文】
リスト変数.Remove(削除する要素);
【サンプルコード】
//リスト作成
Liststring> lst = new Liststring>();
//要素の追加
lst.Add("有限会社");
lst.Add("株式会社");
lst.Add("NEXT");
lst.Add("TECHNOLOGY");
//要素の削除
lst.Remove("有限会社");
//リストの出力
foreach(string elmnt in lst){
Console.WriteLine(list);
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
【応用】Listを使って入力された複数データを処理する
例として、標準入力に下記データが入力された場合にそれぞれの値を出力するサンプルコードを紹介します。
【入力値】
株式会社
NEXT
TECHNOLOGY
【サンプルコード】
using System;
using System.Collections.Generic;
public class Sample{
public static void Main(){
//リストの作成
Liststring> lst = new Liststring>();
//入力行を格納する変数
string line;
//入力行がnullでない間、その値をリストに追加
while ((line = Console.ReadLine()) != null) {
lst.Add(line);
}
//リストの出力
foreach(string elmnt in lst) {
Console.WriteLine(elmnt);
}
}
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
一次元配列の使い方は理解できたでしょうか。
ここからは多次元配列について説明していきます。
4-1.二次元配列
二次元配列は一次元配列を複数行重ねた構造です。
二元配列は行と列の2つのインデックスで要素を表します。
例えば、下記は行が2、列が3の2次元配列arrayです。
string array[2][3] = {
{"座席A", "座席B", "座席C"},
{"座席E", "座席D", "座席F"}
};
各要素は行のインデックスをi、列のインデックスをjとすると下記のように表せます。
array[i][j] | j = 0 | j = 1 | j = 2 |
---|---|---|---|
i = 0 | 座席A | 座席B | 座席C |
i = 1 | 座席E | 座席F | 座席G |
例えばarray[1][1]は「座席F」です。
4-1-1.二次元配列の作り方
二次元配列の宣言方法は下記の通りです。
データ型[][] 配列名;
データ型[,] 配列名;
ポイント
・多次元配列は次元数を[]の数で表します。(宣言方法①)
・次元数は[]内で,の数でも表すことができます。(宣言方法②)
次に二次元配列の初期化は一次元配列同様に複数あります。
ここでは4パターン紹介します。
パターン1
string[,] array = new string[2, 3];
array[0, 0] = "座席A";
array[0, 1] = "座席B";
array[0, 2] = "座席C";
array[1, 0] = "座席D";
array[1, 1] = "座席E";
array[1, 2] = "座席F";
パターン2
string[,] array = new string[2, 3] {
{"座席A", "座席B", "座席C"},
{"座席E", "座席D", "座席F"}
};
パターン3
string[][] array = {
new string[] {"座席A", "座席B", "座席C"},
new string[] {"座席E", "座席D", "座席F"}
};
③パターン4
配列の長さは{}に指定した要素の数となります。
string[,] array = {
{"座席A", "座席B", "座席C"},
{"座席E", "座席D", "座席F"}
};
4-1-2.二次元配列の要素へのアクセス方法
二次元配列の各要素へアクセスする方法は、配列の宣言方法により異なります。
【宣言方法①の場合】
配列名[行インデックス][列インデックス]
Console.WriteLine(array[0][0]);
Console.WriteLine(array[0][1]);
【出力結果】
【宣言方法②の場合】
配列名[行インデックス, 列インデックス]
Console.WriteLine(array[1, 0]);
Console.WriteLine(array[1, 1]);
【出力結果】
4-1-3.ループで二次元配列を処理する
一次元配列と同様に、二次元配列(多次元配列)もループを使うと効率よくデータを処理することができます。
ここではforとforeachを使って二次元配列の各要素を表示するサンプルコードを紹介します。
【二次元配列でのLengthの使い方】
二次元配列でのLengthの使い方のポイントは下記の通りです。
【構文】
・配列の行数を取得する :配列.Length
・配列の行の列数を取得する :配列[行番号].Length
【サンプルコード】
//二次元配列作成
string[][] array = {
new string[] {"座席A", "座席B", "座席C"},
new string[] {"座席E", "座席D", "座席F"}
};
//行数出力
Console.WriteLine(array.Length);
//列数出力
Console.WriteLine(array[0].Length);
【出力結果】
二次元配列のLengthの使い方をおさえた上で、ループで二次元配列の各要素を出力するサンプルコードを見てみましょう。
ポイント
・二次元配列のためループは二重となる
【forループ】
//二次元配列作成
string[][] array = {
new string[] {"座席A", "座席B", "座席C"},
new string[] {"座席E", "座席D", "座席F"}
};
//行の要素数分ループ
for(int i = 0; i array.Length; i++){
//列の要素数分ループ
for(int j = 0; j array[i].Length; j++){
//末尾に半角スペースを加えて該当要素を出力
Console.Write(array[i][j] + " ");
}
//該当行のすべての要素を出力したところで改行
Console.WriteLine();
}
【foreachループ】
//二次元配列作成
string[][] array = {
new string[] {"座席A", "座席B", "座席C"},
new string[] {"座席E", "座席D", "座席F"}
};
//行の要素数分ループ
foreach(string[] line in array){
//列の要素分ループ
foreach(string row in line){
//末尾に半角スペースを加えて該当要素を出力
Console.Write(row + " ");
}
//該当行のすべての要素を出力したところで改行
Console.WriteLine();
}
【出力結果】
出力結果はfor、foreachどちらも同じです。
座席A 座席B 座席C
座席E 座席D 座席F
4-1-4.二次元配列でのListクラスの使い方
二次元配列でのListクラスの使い方は下記の流れで使うことができます。
①大本のリストを用意する
②データ追加用のリストを作りデータを追加する。
③②を①に追加する。
using System;
using System.Collections.Generic;
public class Sample{
public static void Main(){
//大本のリスト作成
ListListstring>> lst = new ListListstring>>();
for (int i = 1; i 3; i++){
//データ追加用のリストの作成
Liststring> item = new Liststring>();
//データの追加
item.Add("列" + i.ToString());
item.Add("座席1");
item.Add("座席2");
item.Add("座席3");
//大本のリストにデータ追加用のリストを追加する
lst.Add(item);
}
//行の要素数分ループ
foreach(Liststring> line in lst){
//列の要素分ループ
foreach(string row in line){
//末尾に半角スペースを加えて該当要素を出力
Console.Write(row + " ");
}
//該当行のすべての要素を出力したところで改行
Console.WriteLine();
}
}
}
【出力結果】
列1 座席1 座席2 座席3
列2 座席1 座席2 座席3
4-2.三次元配列
三次元配列は、二次元配列を積み重ねた構造です。
三元配列は3つのインデックス表します。
下記例は行の要素数が2、列の要素数が3の2次元配列を3つ積み重ねた三次元配列arrayです。
int[][][] array = {
new int[][] {
new int[] {0, 1, 2},
new int[] {3, 4, 5}
},
new int[][] {
new int[] {6, 7, 8},
new int[] {9, 10 ,11}
},
new int[][] {
new int[] {12, 13, 14},
new int[] {15, 16, 17}
}
};
各要素は行のインデックスをi、列のインデックスをjとすると下記のように表せます。
array[0][i][j] | j = 0 | j = 1 | j = 2 |
---|---|---|---|
i = 0 | 0 | 1 | 2 |
i = 1 | 3 | 4 | 5 |
array[1][i][j] | j = 0 | j = 1 | j = 2 |
---|---|---|---|
i = 0 | 6 | 7 | 8 |
i = 1 | 9 | 10 | 11 |
array[2][i][j] | j = 0 | j = 1 | j = 2 |
---|---|---|---|
i = 0 | 12 | 13 | 14 |
i = 1 | 15 | 16 | 17 |
例えばarray[0][1][2]は「5」です。
4-2-1.三次元配列の作り方
三次元配列の宣言方法は下記の通りです。
二次元配列と考え方は同じです。
【構文】
//宣言方法①
データ型[][][] 配列名;
//宣言方法②
データ型[,,] 配列名;
次に配列の初期化は二次元配列同様に複数ありますが、ここでは1つ紹介します。
【サンプルコード】
int[][][] array = {
new int[][] {
new int[] {0, 1, 2},
new int[] {3, 4, 5}
},
new int[][] {
new int[] {6, 7, 8},
new int[] {9, 10 ,11}
},
new int[][] {
new int[] {12, 13, 14},
new int[] {15, 16, 17}
}
};
4-2-2.三次元配列の要素へのアクセス方法
三次元配列の各要素へアクセスするためには下記のように記載します。
【構文】
配列名[二次元配列のインデックス][行インデックス][列インデックス]
下記は4-2ー1で作成した配列の要素を出力するコードです。
【サンプルコード】
Console.WriteLine(array[0][0][0]);
Console.WriteLine(array[0][0][1]);
Console.WriteLine(array[0][0][2]);
Console.WriteLine(array[0][1][0]);
Console.WriteLine(array[0][1][1]);
Console.WriteLine(array[0][1][2]);
Console.WriteLine(array[1][0][0]);
Console.WriteLine(array[1][0][1]);
Console.WriteLine(array[1][0][2]);
...
【出力結果】
4-2-3.ループで三次元配列を処理する
ここではforeachループで三次元配列の各要素を出力するサンプルコードを紹介します。
ポイント
・三次元配列のためループは三重となる
【サンプルコード】
using System;
public class Sample{
public static void Main(){
//三次元配列作成
int[][][] array = {
new int[][] {
new int[] {0, 1, 2},
new int[] {3, 4, 5}
},
new int[][] {
new int[] {6, 7, 8},
new int[] {9, 10 ,11}
},
new int[][] {
new int[] {12, 13, 14},
new int[] {15, 16, 17}
}
};
//二次元配列の要素分ループ
foreach (int[][] arr in array){
//行の要素数分ループ
foreach (int[] line in arr){
//列の要素数分ループ
foreach (int row in line){
//末尾に半角スペースを加えて該当要素を出力
Console.Write(row + " ");
}
//該当行のすべての要素を出力したところで改行
Console.WriteLine();
}
//該当二次元配列のすべての要素を出力したところで改行
Console.WriteLine();
}
}
}
ここでは配列と一緒に使うと便利なプロパティ・メソッドを4個紹介します。
5-1.Lengthプロパティ
Lengthプロパティを使うと配列の要素数をint型で返します。
配列内に要素がない場合は0を返します。
名前空間Systemに定義されています。
【構文】
【サンプルコード】
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};
//配列の要素巣出力
Console.WriteLine(array.Length);
【出力結果】
5-2.Splitメソッド
Splitメソッドを使うと指定した区切り文字でデータを分けて配列を作ることがで来ます。
名前空間Systemに定義されています。
例えばcsv(カンマ区切り)データを配列にしたい時などに使えます。
【構文】
元データ.Split('区切り文字');
注意点
・Split()内に指定する区切り文字はシングルクオテーション(”)で囲みます
【サンプルコード】
下記はカンマ(,)で区切られたデータを配列にし出力するサンプルコードです。
//元データ
string data = "株式会社,NEXT,TECHNOLOGY";
//元データを,で分けて配列に格納
string[] array = data.Split(',');
//配列出力
foreach(string arr in array){
Console.WriteLine(arr);
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
5-3.string.Joinメソッド
string.Joinメソッドを使うと、配列内の要素を指定した区切り文字で区切って連結することができます。
名前空間Systemに定義されています。
【構文】
string.Join("区切り文字", 配列)
【サンプルコード】
下記は、各要素を半角スペース区切りで連結し出力するサンプルコードです。
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};
//各要素を半角スペース区切りで出力
Console.WriteLine(string.Join(" ", array));
【出力結果】
株式会社 NEXT TECHNOLOGY
5-4.Array.Resizeメソッド
Array.Resizeメソッドは配列の長さを変更することができます。
名前空間Systemに定義されています。
【構文】
Array.Resize(ref 長さを変更したい配列, 変更後の長さ)
構文内のrefは値の受け渡し方法の1つで、参照渡しと呼ばれます。
基本的な値の受け渡し方法である、値渡しと下記のような違いがあります。
・値渡し: メソッド内で引数の値を書きかえても、呼び出し元には影響しない。
・参照渡し(ref): メソッド内での値の書き換えの影響が呼び出し元に伝搬する。
詳しくは下記をご参照ください。
【サンプルコード】
//配列作成
string[] array = new string[2] {"株式会社","NEXT"};
//リサイズ(現在の長さに+1)
Array.Resize(ref array, array.Length + 1);
//追加した要素に値を代入
array[array.Length - 1] = "TECHNOLOGY";
//配列出力
foreach(string arr in array){
Console.WriteLine(arr);
}
【出力結果】
株式会社
NEXT
TECHNOLOGY
いかがでしたでしょうか。
配列の学習の参考になれば幸いです。
また、サンプルコードは必要個所を変更してそのまま使えるので是非ご活用ください。
Views: 0