DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

配列やコレクションのすべての要素に処理を行う

例えば、配列内のすべての要素の値を1増やしたいというように、配列やコレクションのすべての要素に指定した処理を行う方法をいくつか紹介します。

for文でループする

言うまでもないとは思いますが、for文でループするというのが基本です。一応以下に例を示します。この例では、整数の配列の各要素を1増やしています。

VB.NET
コードを隠すコードを選択
'基の配列 
Dim ary1 As Integer() = {0, 1, 2, 3, 4}

'forですべての要素を列挙する 
For i As Integer = 0 To ary1.Length - 1
    '1増やす 
    ary1(i) += 1
Next

'ary1は{ 1, 2, 3, 4, 5 }となる
C#
コードを隠すコードを選択
//基の配列
int[] ary1 = { 0, 1, 2, 3, 4 };

//forですべての要素を列挙する
for (int i = 0; i < ary1.Length; i++)
{
    //1増やす
    ary1[i]++;
}

//ary1は{ 1, 2, 3, 4, 5 }となる

ConvertAllメソッドを使う

.NET Framework 2.0以降では、ConvertAllメソッドを使うことができます。ConvertAllメソッドは配列やコレクションの型を変換するためのものですが、型を変更しない使い方もできます。

ConvertAllメソッドは、配列の場合は、スタティックメソッド(Array.ConvertAll<T>メソッド)です。コレクションでは、List(List<T>.ConvertAllメソッド)などで使用でき、こちらはインスタンスメソッドです。

ConvertAllメソッドはConverter(TInput, TOutput)デリゲートによって、要素にどのような処理を行うかを指定します。下の例では、指定された値に1プラスするメソッド(IncrementOneメソッド)を作成して、そのデリゲートをConvertAllに渡しています。

VB.NET
コードを隠すコードを選択
'指定された値を1増やして返すメソッド
Private Shared Function IncrementOne(ByVal i As Integer) As Integer
    Return i + 1
End Function

'Button1のClickイベントハンドラ 
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

    '基の配列 
    Dim ary1 As Integer() = {0, 1, 2, 3, 4}

    '配列のすべての要素を1増やす 
    Dim ary2 As Integer() = Array.ConvertAll(ary1, AddressOf IncrementOne)

    'Listの場合は、以下のようになる
    Dim lst3 As List(Of Integer) = _
        (New List(Of Integer)(ary1)).ConvertAll(IncrementOne)
End Sub
C#
コードを隠すコードを選択
//指定された値を1増やして返すメソッド
private static int IncrementOne(int i)
{
    return i + 1;
}

//Button1のClickイベントハンドラ
private void button1_Click(object sender, System.EventArgs e)
{
    //基の配列
    int[] ary1 = { 0, 1, 2, 3, 4 };

    //配列のすべての要素を1増やす
    int[] ary2 = Array.ConvertAll(ary1, IncrementOne);

    //Listの場合は、以下のようになる
    List<int> lst3 = (new List<int>(ary1)).ConvertAll(IncrementOne);
}

C#では、匿名メソッドを使って簡単に記述できます。残念ながら、匿名メソッドはVB.NETでは使えません。

C#
コードを隠すコードを選択
//基の配列
int[] ary1 = { 0, 1, 2, 3, 4 };

//配列のすべての要素を1増やす
int[] ary2 = Array.ConvertAll(ary1, delegate(int i) { return i + 1; });

ラムダ式が使えるのであれば(VB9、C#3.0、.NET Framework 3.5、Visual Studio 2008以降)、さらに簡単に記述できます。

VB.NET
コードを隠すコードを選択
'基の配列 
Dim ary1 As Integer() = {0, 1, 2, 3, 4}

'配列のすべての要素を1増やす
Dim ary2 As Integer() = Array.ConvertAll(ary1, Function(i As Integer) i + 1)
C#
コードを隠すコードを選択
//基の配列
int[] ary1 = { 0, 1, 2, 3, 4 };

//配列のすべての要素を1増やす
int[] ary2 = Array.ConvertAll(ary1, i => i + 1);

Selectメソッドを使う

.NET Framework 3.5以降でLINQが使えるのならば、Enumerable.Selectメソッドが使えます。

VB.NET
コードを隠すコードを選択
'Imports System.Linq

'基の配列(コレクションでも可)
Dim ary1 As Integer() = {0, 1, 2, 3, 4}

'配列のすべての要素を1増やす
Dim ary2 As Integer() = ary1.Select(Function(i) i + 1).ToArray()

'クエリ式を使うと、次のようにできる
'Dim ary2 As Integer() = (From i In ary1 _
'                         Select i + 1).ToArray()
C#
コードを隠すコードを選択
//using System.Linq;

//基の配列(コレクションでも可)
int[] ary1 = { 0, 1, 2, 3, 4 };

//配列のすべての要素を1増やす
int[] ary2 = ary1.Select(i => i + 1).ToArray();

//クエリ式を使うと、次のようにできる
//int[] ary2 = (from i in ary1
//              select i + 1).ToArray();
  • 履歴:
  • 2013/8/25 「Selectメソッドを使う」のサンプルを1つにして、クエリ式を使った例をコメントにしたなど。
  • 2016/6/26 「ConvertAllメソッドを使う」のサンプルにListの例を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。