2011-11-23 58 views
3
到列表2

如果我有兩個泛型這樣定義的列表:拷貝內容與特定標準

​​

存在從列表中的某些功能複製內容(ES:list1的)到其它列表(ES:列表2)只有當一些領域的尊重條件?例如,我想從list1複製list2所有記錄,其中a是相同的值,例如1. 結果是在list2中我有list1的所有記錄,其中a = 1,排除其他a值不等於1的所有其他記錄。 誠懇我已經解決了問題,這樣做:

for iIndex := 0 to Pred(list1.Count) do 
    if list1[iIndex].a = myvalue then list2.Add(list1[iIndex]); 

,但想知道是否有更具體的東西換做此操作,例如使用德爾福的一些功能。 非常感謝。

+1

你需要的是LINQ。在Delphi中不可用。 –

+0

'Collections'庫嘗試給我們一些類似LINQ的功能:http://code.google.com/p/delphi-coll/ –

+0

我曾試着在網站上看,但由於我不能理解適用於我的情況,我需要選擇什麼。可以給我一些細節或關於我可以應用於我的情況的例子?再次感謝。 –

回答

0

這是怎麼回事?

class procedure TCollectionUtils.CopyItems<T> (List1, List2 : TList <T>; Pred : TFunc <T, Boolean>); 
var 
Item : T; 
begin 
for Item in List1 do 
    if Pred (Item) then 
    List2.Add (Item); 
end; 

呼叫是這樣的:

TCollectionUtils.CopyItems <pMyList> (list1, list2, 
    function (Item : pMyList) : Boolean 
    begin 
    Result := (pMyList.a = 1); 
    end); 

(這裏沒有德爾福現在)

+0

德爾福不支持參數化的例程。 –

+0

是的。但是,這可以很容易地作爲一個類的方法。 – jpfollenius

+0

對於那些因爲這麼小的事情而冷靜的nitpickers:我編輯它以使用類方法。 – jpfollenius

4

不幸的是,因爲德爾福缺乏使用集合或通用列出了從Spring框架lambda表達式可以使源代碼更長一點。還有一些人不喜歡使用匿名方法,因爲它們的語法非常繁瑣。但這是品味imho的問題。

隨着收藏品的例子是這樣的:

list2.AddAll(list1.Where(
    function(value: pMyList): Boolean 
    begin 
    Result := value.a = myvalue; 
    end)); 

請記住,這兩個提到的泛型列表實現都實現接口和大多數的方法是與他們工作。在上面的例子中,這並不重要,因爲您沒有直接傳遞list1。否則它會被釋放。

有了這個例子,使用它們的好處可能並不明確,但是當您執行大量操作時,過濾數據,將它們放入其他列表中並且更加容易,並且不必額外編寫大量方法來完成這些操作。但正如我所說這是一個趣味問題,許多delphi開發人員似乎不喜歡這種語法和編寫代碼的方式。