星期五, 11月 16, 2012

Convert IEnumable to IEnumable<T>

今天來這分享一下使用 Linq 遇到的小問題,當我們 Linq 用越用熟後,遇到集合 (Collecion) 都會習慣用 Linq 去解決它,今天在 WebFrom 的 Project 裡面,想要把某個 Control 下面所有個 TextBox 的 Type 抓出來,下了這一段程式

PlaceHolder1.Controls.Where(a=>a is TextBox)

結果就給我暴了..><..

為什麼會暴呢?查了 Controls 的 Source Code 看仔細,原來是 PlaceHolder1.Controls 只有實作 IEnumerable..

public class ControlCollection : ICollection, Ienumerable

Linq 常用 Extention Method 大部分都要實作 IEnumerable<T> 這個泛型,如 Where, OrderBy 等,所以沒有腦袋直直想的解決的方法就是把 IEnumable 轉成 IEnumable<T>..XD..

一開始想自己寫一個 Extention Method,不過太陽底下沒有新鮮事,MSND 找了一下,查到可以轉換的有兩個 Method,就是 OfType<T> 和 Cast<T> 這兩個 Extention Method,貼一下 MSDN 的解釋
http://msdn.microsoft.com/zh-tw/library/bb360913.aspx
Enumerable.OfType<TResult>
方法根據指定的型別來篩選 IEnumerable 的項目。

http://msdn.microsoft.com/zh-tw/library/bb341406.aspx
Enumerable.Cast<TResult>
方法將 IEnumerable 的項目轉換成指定的型別。

簡單說就是轉型成 IEnumable<T> 啦,使用時候要小心,如果用 Cast<T> 來做,集合裡面有其他 Type 的 Contnrol 會暴掉,所以我是用 OfType<TResult> 來處理

最後解決方法就是這樣啦..

PlaceHolder1.Controls.OfType<TextBox>()

有問題再討論吧!!!

沒有留言: