こんにちは!
フリーランス(エンジニア/ライター)のイシキです。
この記事では、配列の要素数を取得・変更する方法について
- 配列の要素数(サイズ)とは
- Lengthプロパティで要素数を取得する方法
- GetLengthメソッドで要素数を取得する方法</li>
といった基本的な内容から
など応用的な使い方についても解説していきます。
配列は繰り返し構文と相性がよいので、よく要素数で繰り返しを行いますよね。その時に要素数を直接、数字で記入してしまうといくつか問題があります。
例えば、数字なのでなぜその数なのか分かりづらいです。他にも、配列の要素数を変更した場合に修正が必要になります。
そのような問題を回避するために、この記事では配列の要素数の取得や変更について、例を交えながら詳しく解説していきます。
配列の要素数(サイズ)とは
配列は、同じ型の複数のデータを一つのかたまりとして扱うためのものです。
配列の基本的な使い方はこちらの記事をチェックしてみてください。
例えば、配列には次のようなものがあります。
int[] numbers = { 0, 1, 2, 3, 4 };
この配列は、0から4までの5つの数を持っています。このとき、これらの数を配列の要素といい、配列の要素数は5になります。
例えば、次のように繰り返し処理などで要素数である5を使用することがありますね。
int[] numbers = { 0, 1, 2, 3, 4 }; for (int i = 0; i < 5; i++) { 繰り返し行う処理 ... }
ここでは、要素数を意味する5ですが、そうでない場合もありますよね。ただ、5と書かれているだけでは意味が通じないことがあるのです。
また、次のように配列の要素を減らした場合を考えてみましょう。
int[] numbers = { 0, 1, 2, 3 }; for (int i = 0; i < 4; i++) { 繰り返し行う処理 ... }
要素数が4になるため、繰り返す回数も修正されています。このように1つ配列を変更するために、2ヵ所以上の修正を行うのは効率的ではありません。
そのため、C#では配列の要素数を取得するプロパティやメソッドが用意されています。
Lengthプロパティで要素数を取得する方法
Lengthプロパティで要素数を取得する方法は、次の通りです。
配列.Length
次のサンプルコードは、配列の全ての要素を出力しています。
using System; namespace Sample { class Program { static void Main() { int[] numbers = { 0, 1, 2, 3 }; for (int i = 0; i < numbers.Length; i++) { Console.WriteLine("{0}番目の要素の値は{1}です。", i + 1, numbers[i]); } } } }
[実行結果]
1番目の要素の値は0です。 2番目の要素の値は1です。 3番目の要素の値は2です。 4番目の要素の値は3です。
数字で繰り返す場合と違い、Lengthという名前から配列の要素数の分だけ繰り返していることが分かります。
また、配列の定義を変更したとしても、常にすべての要素が出力されます。実行結果を見ても、すべての要素が出力されていることが確認できます。
GetLengthメソッドで要素数を取得する方法
Lengthプロパティを多次元配列で使用した場合、全ての要素数を返します。
そこで、ある次元の要素数のみを取得したい場合、次のようにGetLengthメソッドで要素数を取得する方法を使用します。
配列.GetLength(次元のインデックス番号)
例えば、2次元配列で考えると次のサンプルコードのようになります。
using System; namespace Sample { class Program { static void Main() { int[,] numberTable = { { 4, 5, 6 }, { 7, 8, 9 }, }; Console.WriteLine("1次元の要素数は{0}です。", numberTable.GetLength(0)); Console.WriteLine("2次元の要素数は{0}です。", numberTable.GetLength(1)); } } }
[実行結果]
1次元の要素数は2です。 2次元の要素数は3です。
今回の場合、「numberTable.GetLength(0)」が1次元の要素数である2を返します。そして、「numberTable.GetLength(1)」が2次元の要素数である3を返します。
実行結果からもこのことが確認できます。
Resizeメソッドで要素数の上限を変更する方法
Resizeメソッドで要素数の上限を変更する方法は、次の通りです。
Array.Resize(ref 配列, 変更後の要素数の上限)
refキーワードは、引数を「参照渡し」で扱う場合に使います。refキーワードはメソッドの定義と、呼び出しの両方で指定します。
これまで行ってきたキーワードを指定しない引数の指定方法は「値渡し」といいます。「参照渡し」は「値渡し」とは違い、メソッド内部での変更が呼び出し元に反映されます。
Resizeメソッドは、配列の要素数の上限を変更して、呼び出し元に反映する必要があるのでrefキーワードを使用しています。
それでは、実際にサンプルコードを見てみましょう。
using System; namespace Sample { class Program { static void Main() { int[] numbers = { 0, 1, 2, 3 }; Array.Resize(ref numbers, numbers.Length * 2); for (int i = 0; i < numbers.Length; i++) { Console.WriteLine("{0}番目の要素の値は{1}です。", i + 1, numbers[i]); } } } }
[実行結果]
1番目の要素の値は0です。 2番目の要素の値は1です。 3番目の要素の値は2です。 4番目の要素の値は3です。 5番目の要素の値は0です。 6番目の要素の値は0です。 7番目の要素の値は0です。 8番目の要素の値は0です。
要素数の上限を2倍にするため「Array.Resize(ref numbers, numbers.Length * 2);」としています。
実行結果から、要素数の上限が変更され、2倍になっていることが確認できます。
Emptyメソッドで要素数0の配列を取得する
要素数0の配列を取得する方法は次の通りです。
Array.Empty<int>();
using System; namespace Sample { class Program { static void Main() { int[] numbers = Array.Empty<int>(); Console.WriteLine("配列の要素数は{0}です。", numbers.Length); } } }
[実行結果]
配列の要素数は0です。
実行結果から要素数0の配列を取得できていることが確認できます。Emptyメソッドは「.NET Framework」4.6以降のバージョンで使用可能です。
[.NET Frameworkのバージョン確認]
使用できない方は、メニューバーの「プロジェクト→プロパティ」とクリックし、アプリケーションタブのターゲットフレームワークを確認してください。
まとめ
いかがでしたか?
今回は、配列の要素数を取得・変更する方法について解説しました。
配列を使うと自然にその要素数を使う機会も増えるでしょう。LengthプロパティやGetLengthメソッドで可読性や保守性を高められるので覚えておくといいですね。
もし、配列の要素数を取得・変更する機会があれば、この記事を思い出してみてください!