很少在程式裡使用到 ArrayList 這個類別,所以一時間還沒有馬上意會過來,所以查了一下 MSDN 上面的說明:
MSDN - ArrayList 類別 (System.Collections)
這個類別有實作 IList 介面,而且使用大小會視需要而動態增加的陣列。
但如果我們要操作一段 LINQ 查詢,所使用的條件值是 ArrayList 而且輸出的結果也需要是 ArrayList 時,應該怎麼處理呢?
就來練習看看吧!
練習工具:LINQPad (練習 LINQ 的好工具,免費版與付費版最大的差別就在於有無 Intellisence)
這個部落格也有多篇文章在介紹 LINQPad 以及使用的方法,建議大家可以參考看看。
在練習之前,先來看看一般我們如果有一組條件值,而我們想要使用這些條件值做 Contains 操作時是怎麼處理的。
首先我建立了一個物件集合,使用的類別是 List<T>
接著是使用這一組資料去找出 Northwind – Customers 裡,將 Country 欄位值有符合條件的資料給找出來,
T-SQL
如果要做反向查詢,也就是要把不符合條件值得資料給找出來的話,就是以下的操作,
那麼如果我的條件值不是使用 List<T> 型別而是使用 ArrayList 類別呢?
ArrayList 類別有提供 AddRange 方法,可將 ICollection 的元素加入到 ArrayList 內,所以我們可以把剛才使用 List<T> 類別的條件值使用 AddRange 方法加入到 ArrayList 中,
再來就是在 LINQ 的查詢操作,如果還是使用與 List<T> 的方式看待 ArrayList 的話,就會遇到錯誤,錯誤的原因為「使用 LINQ 查詢非泛型 IEnumerable 集合 (如 ArrayList) 時,必須明確宣告範圍變數的型別,以反映集合中特定物件的型別。」,程式改寫為以下的內容:
取出符合條件值的資料
取出不符合條件值的資料
如果條件值的內容並非是單一的 String 類別,而是一個自訂類別時,可以參考以下的作法:
類別與條件值
查詢式(Query Syntax)
結果
T-SQL
如果要改用方法語法(Method Syntax)的話,就改用以下的程式:
查詢結果與 T-SQL 是一樣的(這不廢話嘛)
補充
好像忘了說明怎麼把 List<T> 轉換為 ArrayList,其實文章的內文一開始就有說明過,ArrayList 有實作 IList 與 ICollection 介面,而同樣的 List<T> 也有實作 IList 與 ICollection,所以就直接使用 ArrayList 所提供的 AddRange 方法就可以將有實作 ICollection 介面的 List<T> 給加入到 ArrayList 的結尾,或是建立 ArrayList 物件時使用建構式將 ICollection 複製到新的 ArrayList 清單中。
MSDN - ArrayList 建構函式 (ICollection) (System.Collections)
MSDN - ArrayList.AddRange 方法 (System.Collections)
MSDN - List<T> 類別 (System.Collections.Generic)
延伸閱讀
MSDN - 如何:使用 LINQ 查詢 ArrayList
以上
好問題,我也一直在想什麼樣的情況會使用到 ArrayList,
回覆刪除這是因為一個問題而產生的文章,所以就把題目定為練習題,
不過微軟 MVP 余小章在他的部落格里就有一篇文章做這樣的說明,
[C#.NET][VB.NET] ArrayList 與 List<> 執行效能比較 - 余小章 @ 大內殿堂- 點部落
http://www.dotblogs.com.tw/yc421206/archive/2009/10/22/11213.aspx
另外 MSDN 也有一篇文章也是在說明兩者的差異,
MSDN - ArrayList 和 List 集合類型
http://msdn.microsoft.com/zh-tw/library/41107z8a.aspx