2014年4月20日 星期日

練習題 - LINQ Contains 操作與 ArrayList

很少在程式裡使用到 ArrayList 這個類別,所以一時間還沒有馬上意會過來,所以查了一下 MSDN 上面的說明:

MSDN - ArrayList 類別 (System.Collections)

這個類別有實作 IList 介面,而且使用大小會視需要而動態增加的陣列。

但如果我們要操作一段 LINQ 查詢,所使用的條件值是 ArrayList 而且輸出的結果也需要是 ArrayList 時,應該怎麼處理呢?

就來練習看看吧!


練習工具:LINQPad (練習 LINQ 的好工具,免費版與付費版最大的差別就在於有無 Intellisence)

這個部落格也有多篇文章在介紹 LINQPad 以及使用的方法,建議大家可以參考看看。

mrkt 的程式學習筆記 – LINQPad 相關文章

 

在練習之前,先來看看一般我們如果有一組條件值,而我們想要使用這些條件值做 Contains 操作時是怎麼處理的。

首先我建立了一個物件集合,使用的類別是 List<T>

image

接著是使用這一組資料去找出 Northwind – Customers 裡,將 Country 欄位值有符合條件的資料給找出來,

image

T-SQL

image

 

如果要做反向查詢,也就是要把不符合條件值得資料給找出來的話,就是以下的操作,

image

image

 

那麼如果我的條件值不是使用 List<T> 型別而是使用 ArrayList 類別呢?

ArrayList 類別有提供 AddRange 方法,可將 ICollection 的元素加入到 ArrayList 內,所以我們可以把剛才使用 List<T> 類別的條件值使用 AddRange 方法加入到 ArrayList 中,

image

再來就是在 LINQ 的查詢操作,如果還是使用與 List<T> 的方式看待 ArrayList 的話,就會遇到錯誤,錯誤的原因為「使用 LINQ 查詢非泛型 IEnumerable 集合 (如 ArrayList) 時,必須明確宣告範圍變數的型別,以反映集合中特定物件的型別。」,程式改寫為以下的內容:

取出符合條件值的資料

image

image

取出不符合條件值的資料

image

image

 

如果條件值的內容並非是單一的 String 類別,而是一個自訂類別時,可以參考以下的作法:

類別與條件值

image

查詢式(Query Syntax)

image

結果

image

T-SQL

image

如果要改用方法語法(Method Syntax)的話,就改用以下的程式:

image

查詢結果與 T-SQL 是一樣的(這不廢話嘛)

image

 

補充

好像忘了說明怎麼把 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

 

以上

1 則留言:

  1. 好問題,我也一直在想什麼樣的情況會使用到 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

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。