中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

ジェネリックとは?第4回 List<T>.ConvertAll<U>(Converter<T, U>)

第4回 List<T>.ConvertAll< U >(Converter<T, U>)

今回でListも最後になる。ちょっとややこしい、Uが出てくるパターンだ。 

文字列に数字文字が入っているArrayListから数字に変換して新しいArrayListを作り出すという想定だ。

1.x C#
ArrayList al = new ArrayList();
al.Add("1");
al.Add("2");
al.Add("3");
ArrayList al2 = new ArrayList();
foreach( string text in al)
{
  al2.Add(int.Parse(text));
}
1.x VB
Dim al As ArrayList = New ArrayList
al.Add("1")
al.Add("2")
al.Add("3")
Dim al2 As ArrayList = New ArrayList
For Each text As String In al
  al2.Add(Int32.Parse(text))
Next
1.x MC++
ArrayList __gc *al = new ArrayList();
al->Add(S"1");
al->Add(S"2");
al->Add(S"3");
ArrayList __gc *al2 = new ArrayList();
for ( int LoopCounter = 0; LoopCounter < al->Count; LoopCounter++ )
{
  al2->Add(__box(Int32::Parse(static_cast<String*>(al->Item[LoopCounter]))));
}

前回とほとんどコードは変わらない、前回はint.Parseすることによって検査していただけだが、al2にaddしているのが違うポイントだ。
#MC++はここまでくると何をやっているのかという感じだ・・・

<T, U>といってもそうしり込みする必要は無い。

2.0 C#
private void button1_Click(object sender, EventArgs e)
{
  List<string> ls = new List<string>();
  ls.Add("1");
  ls.Add("2");
  ls.Add("3");
  Converter<string, int> intconv = new Converter<string, int>(IntConverter);
  List<int> ls2 = ls.ConvertAll<int>(intconv);
}
public int IntConverter(string text)
{
  return int.Parse(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("1")
  ls.Add("2")
  ls.Add("3")
  Dim intconv As Converter(Of String, Integer) = New Converter(Of String, Integer)(AddressOf IntConverter)
  Dim ls2 As List(Of Integer) = ls.ConvertAll(intconv)
End Sub
Public Function IntConverter(ByVal text As String) As Integer
  IntConverter = Int32.Parse(text)
End Function
2.0 C++/CLI
##注意 このコードはコンパイルを通りません。どうすれば通るか調査中。わかる人は教えてください。
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
  {
    List<String^>^ ls = gcnew List<String^>();
    ls->Add("1");
    ls->Add("2");
    ls->Add("3");
    Converter<String^, int>^ intconv = gcnew Converter<String^, int>(this, &Form1::IntConverter);
    List<int>^ ls2 = ls->ConvertAll<int>(intconv);
  }
public :
  int IntConverter(String^ text)
  {
    return Int32::Parse(text);
  }

Converterデリゲート型といっても単純に変換を意味する変換元を受け取って、変換後をreturnするような形態だ。
1.xのソースと見比べてどれだけ単純にしかもintに変換するというのが文脈から読み取りやすくなっているだろう。

2.0 C#(匿名メソッドを使った場合)
private void button2_Click(object sender, EventArgs e)
{
  List<string> ls = new List<string>();
  ls.Add("1");
  ls.Add("2");
  ls.Add("3");
  List<int> ls2 = ls.ConvertAll<int>(delegate(string text)
  {
    return int.Parse(text);
  });
}

連載をまとめてあります。 http://blogs.users.gr.jp/naka/category/285.aspx

投稿日時 : 2004年12月5日 20:24

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント