例えば、配列内のすべての要素の値を1増やしたいというように、配列やコレクションのすべての要素に指定した処理を行う方法をいくつか紹介します。
言うまでもないとは思いますが、for文でループするというのが基本です。一応以下に例を示します。この例では、整数の配列の各要素を1増やしています。
'基の配列 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 }となる
//基の配列 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 }となる
.NET Framework 2.0以降では、ConvertAllメソッドを使うことができます。ConvertAllメソッドは配列やコレクションの型を変換するためのものですが、型を変更しない使い方もできます。
ConvertAllメソッドは、配列の場合は、スタティックメソッド(Array.ConvertAll<T>メソッド)です。コレクションでは、List(List<T>.ConvertAllメソッド)などで使用でき、こちらはインスタンスメソッドです。
ConvertAllメソッドはConverter(TInput, TOutput)デリゲートによって、要素にどのような処理を行うかを指定します。下の例では、指定された値に1プラスするメソッド(IncrementOneメソッド)を作成して、そのデリゲートをConvertAllに渡しています。
'指定された値を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
//指定された値を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では使えません。
//基の配列 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以降)、さらに簡単に記述できます。
'基の配列 Dim ary1 As Integer() = {0, 1, 2, 3, 4} '配列のすべての要素を1増やす Dim ary2 As Integer() = Array.ConvertAll(ary1, Function(i As Integer) i + 1)
//基の配列 int[] ary1 = { 0, 1, 2, 3, 4 }; //配列のすべての要素を1増やす int[] ary2 = Array.ConvertAll(ary1, i => i + 1);
.NET Framework 3.5以降でLINQが使えるのならば、Enumerable.Selectメソッドが使えます。
'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()
//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();