2009-06-12 103 views
0

我剛將項目升級到.NET 3.5,並認爲我對LINQ有完美的使用。我的應用程序有一個窗口管理器,在運行時跟蹤打開的窗口,我試圖添加一個FindOpenWindows通用方法。我到目前爲止所做的:帶有泛型謂詞約束的LINQ

List<Form> openWindows; 

    public List<T> FindOpenWindows<T>(Predicate<T> constraint) 
    { 
     var foundTs = from form in openWindows 
          where constraint(form) 
           && form.Created 
          select form; 

     return foundTs as List<T>; 
    } 

但我得到「委託System.Predicate有一些無效的參數。」所以我改寫的方法:

public List<T> FindOpenWindows<T>(Predicate<Form> constraint) 
    { 
     var foundTs = from form in openWindows 
          where constraint(form as Form) 
           && form.Created 
          select form; 

     return foundTs as List<T>; 
    } 

我之所以沒能進入功能非一般是這樣,來電者恰好獲得他們要找的窗口類型的列表。

由於我是LINQ和Lambda表達式的新手,我不確定如何在調用FindOpenWindows時爲謂詞編寫代碼。我顯然需要能夠驗證被傳入的表單不是空的,我需要能夠檢查它是否與我正在尋找的類型相匹配。

回答

2
public List<T> FindOpenWindows<T>(Predicate<T> constraint) 
    where T : Form 
{ 
    var foundTs = from form in openWindows 
         where constraint(form) 
          && form.Created 
         select form; 

    return foundTs.ToList(); 
} 

試試看。您需要將T約束爲Form類型。

+0

謝謝,這完美的作品!我能夠弄清楚這個電話應該是: List mainWindows = Program.windowManager.FindOpenWindows ((Form f)=> f is frmMain); – jasonh 2009-06-12 19:45:54