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