中の技術日誌
 ホーム / 上へ

技術解説 .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);
  });
}

[戻る] [進む]


勉強会: 05/18 大阪 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告