■窓際プログラマーの独り言 -C#の話題を中心に - C#3.0:ArrayListに対して Linq を使う
■Microsoft - MSDN - Enumerable.OfType(TResult) ジェネリック メソッド (System.Linq)
いま関わってるプロジェクトでは.NET Framework 2.0で動作するアプリケーションなんだけど、2ヶ月ほど前に.NET Framework 1.1から移行したばかりで、回りくどいコードがかなり残ってる。
自分が受け持つ部分だけでも もう少し安全で読みやすいコードにしようと思い、例えばArrayListをジェネリックコレクションのList
に変更したりしてる訳なんだけど、どうしても自分が手を入れられないメソッドの戻り値がArrayListだったりして、結構面倒。
まぁ呼び出す側で戻り値の型変換用メソッドを間にかませば済む話だけど、それもなんか嫌(←わがままw)。
「もしかして.NET Framework 2.0のライブラリに、自分が見落としてる変換メソッドがある?」なんて思ってさっき検索してみたら、2.0にはなさそうだけど、3.0にはLINQライブラリの中にめっちゃ便利なメソッドが用意されてるっぽい。
(サンプルコードはリンク先を見て下さいということで、ここでは文字で簡単にメモ)
ArrayListは要はList<object>のようなものだけど、例えば array という変数名の ArrayList オブジェクトに string, int, char などのオブジェクトが混在格納されているとする。
ここで array.OfType<string>() とすると、なんと array の中から string 型のデータだけかき集めて IEnumerable<string> 型のオブジェクトを返してくれる。
つまり、
List<string> = new List<string>(array.OfType<string>());
と書けちゃう。
IEnumerableだから、もしかしたらnewせずに直接代入できるのかな?
また帰宅してから実際にコード組んで試してみるけど、これは便利。
(追記)
簡単に組んでみた。良いですな^^
using System;
using System.
Collections;
using System.
Collections.
Generic;
using System.
Linq;
namespace ConsoleApplication1
{
class ParentClass
{
public readonly string str;
public ParentClass
(string s
) { this.
str = s;
}
}
class ChildClass : ParentClass
{
public ChildClass
(string s
) :
base(s
) { }
}
class MainClass
{
static void Main
(string[] args
)
{
ArrayList array =
new ArrayList
();
array.
Add(new ParentClass
("P1"));
array.
Add("X");
array.
Add(new ParentClass
("P2"));
array.
Add(1.0);
array.
Add(new ChildClass
("C1"));
array.
Add('c');
array.
Add(new ChildClass
("C2"));
array.
Add(true);
List<ParentClass> list =
new List<ParentClass>
(array.
OfType<ParentClass>
());
list.
ForEach(parent => Console.
WriteLine(parent.
str));
}
}
}
実行結果:
P1
P2
C1
C2