查詢非泛型集合
在 .Net1.X 時代不支持泛型,構造集合時都要轉換或裝箱為Object類型,Linq 查詢是以泛型為基礎的,在老系統升級或整合時要進行非泛型集合操作。Enumerable的Cast<T>() 和OfType<T>()擴展方法使非泛型集合的 Linq 查詢成為可能。ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list.Add(5);
var result = from i in list.Cast<int>()
select i;
foreach (var i in result)
{
Console.WriteLine(i);
}
// result:
// 1
// 2
// 3
// 4
// 5
如果不想顯式調用Cast<T>()方法,可以在元素前面指定類型。上面的例子變為:
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list.Add(5);
var result = from int i in list
select i;
foreach (var i in result)
{
Console.WriteLine(i);
}
我們知道,非泛型不是類型安全的,可以在非泛型的ArrayList中同時插入整型、字符串,那麼上面的方法進行類型轉換會拋出異常,影響操作的繼續進行,OfType<T>()可以一定程度上避免這個問題。如下面的示例會選擇適當的類型而忽略不匹配類型。
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
list.Add("abc");
list.Add(3);
list.Add(4);
var result = from int i in list.OfType<int>()
select i;
foreach (var i in result)
{
Console.WriteLine(i);
}
// result:
// 1
// 2
// 3
// 4
如果這個例子中的集合用上面的Cast<T>()或隱式轉換將會拋出異常。