第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