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

技術解説 .NET 2.0 ジェネリック(Generics)  第4回 List<T>.ConvertAll<TOutput>(Converter<T, TOutput>)

2006/01/26

この文書はVisual Studio 2005をベースに記述されています。

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

今回で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, TOutput>といってもそうしり込みする必要は無い。

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);
  });
}

[戻る] [進む]


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

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

ブログ本家
広告