技術解説 .NET 2.0 ジェネリック(Generics) 第2回 List<T>.ForEach(Action<T>)
2006/01/26
この文書はVisual Studio 2005をベースに記述されています。
第2回 List<T>.ForEach(Action<T>)
前回はArrayListの代わりにList<T>が主役に躍り出るというところまでお話した。
さてList<T>はもちろんそれだけしか機能がないわけじゃない。
Listに格納したデータを取り出してListViewに追加するプログラムを皆さんも書いたことがあるのではないだろうか?
1.x C# ArrayList al = new ArrayList(); al.Add("A"); al.Add("B"); al.Add("C"); foreach( string text in al) { this.listView1.Items.Add(text); }
1.x VB Dim al As ArrayList = New ArrayList al.Add("A") al.Add("B") al.Add("C") For Each text As String In al Me.ListView1.Items().Add(text) Next
1.x MC++ ArrayList __gc *al = new ArrayList(); al->Add(S"A"); al->Add(S"B"); al->Add(S"C"); for ( int LoopCounter = 0; LoopCounter < al->Count; LoopCounter++ ) { this->listView1->Items->Add(static_cast<String*>(al->Item[LoopCounter])); }
このようにコレクションから値を取り出して設定という形をとったのではないだろうか?
.NET2.0からはやり方が少し変わる(もちろん従来型もできるが)
List<T>.ForEach(Action<T>)というメソッドがある。
このメソッドはAction<T>というデリゲートメソッドをコレクションの各項目に実行してくれる。
1.xのforeachが1人ずつ呼び出してなんらかをしたとすると、なんらかかの操作を行えと命令書を発行するようなものだろうか。
ソースを見てほしい
2.0 C# private void button1_Click(object sender, EventArgs e) { List<string> ls = new List<string>(); ls.Add("A"); ls.Add("B"); ls.Add("C"); Action<string> lia = new Action<string>(ListItemAdd); ls.ForEach(lia); } public void ListItemAdd(string text) { this.listView1.Items.Add(text); }
2.0 VB Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ls As List(Of String) = New List(Of String) ls.Add("A") ls.Add("B") ls.Add("C") Dim lia As Action(Of String) = New Action(Of String)(AddressOf ListItemAdd) ls.ForEach(lia) End Sub Public Sub ListItemAdd(ByVal text As String) Me.ListView1.Items().Add(text) End Sub
2.0 C++/CLI private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { List<String^>^ ls = gcnew List<String^>(); ls->Add("A"); ls->Add("B"); ls->Add("C"); Action<String^>^ lia = gcnew Action<String^>(this, &Form1::ListItemAdd); ls->ForEach(lia); } public : Void ListItemAdd(String^ text) { this->listView1->Items->Add(text); }
このように命令書(この場合だとListItemAdd)をlsに渡している。
そうすると、lsはコレクションの全項目にこのデリゲートを実行してくれる。
2.0のC#ではここで取り上げない匿名メソッドという機能がある。この機能を使うとよりシンプルにソースを記述することができる
2.0 C#(匿名メソッドを使った場合) private void button2_Click(object sender, EventArgs e) { List<string> ls = new List<string>(); ls.Add("A"); ls.Add("B"); ls.Add("C"); ls.ForEach(delegate(string text) { this.listView1.Items.Add(text); }); }