2009-10-06 150 views
2

我試圖幫助別人了,寫這個查詢:爲什麼這個LINQ Query不工作?

var foundTab = (from tab in tabControl1.TabPages 
       where tab.Name == "tabName" 
       select tab).First(); 

而且他們報告說,他們收到此錯誤:

Could not find an implementation of the query pattern for source type System.Windows.Forms.TabControl.TabPageCollection'. 'Where' not found. Consider explicitly specifying the type of the range variable 'tab'.

我查MSDN和TabPageCollection工具IListICollectionIEnumerable。那麼,這裏發生了什麼?那個錯誤是什麼意思,還有另一種方式來查詢選項卡控件的TabPages屬性?

回答

8

嘗試這種情況:

var tab = (from System.Windows.Forms.TabPage tab in tabControl1.TabPages 
      where tab.Name == "tabName" 
      select tab).First(); 

此代碼指定的範圍內的變量的類型。此外

var tab = tabControl1.TabPages.FirstOrDefault(t => t.Name == "tabName"); 

,請確保您有

using System.Linq; 

在你的文件的頂部:

+0

我總是忘記一個:) – leppie 2009-10-06 03:49:15

+0

看起來比cast方法更清潔。謝謝! – jasonh 2009-10-06 03:53:20

0

試試這個。

迪倫

4

TabPageCollection實現IEnumerable但不IEnumerable<T>這正是LINQ使用。要修復,請使用如下所示的投射方法:

var foundTab = (from tab in tabControl1.TabPages.Cast<TabPage>() 
      where tab.Name == "tabName" 
      select tab).First(); 
+0

除了我所犯的原始錯誤(「tab」兩次,我忘記了select子句,我很驚訝沒有人注意到,LOL!),這是完美的。感謝提到'IEnumerable''' IEnumerable '的解釋。 – jasonh 2009-10-06 03:49:23

+0

錯誤:Aquery body必須以select或group子句結尾 – Anuya 2009-10-06 03:53:13

+0

呵呵!複製粘貼錯誤:P – 2009-10-06 03:56:25

2

但是,但是......?如果你有這個名字,你可以直接引用它? TabPages [「tabname」]

+0

噓!如果你不使用LINQ,你只是不編程... – Massif 2012-03-08 16:27:08

+0

我已經編程了20年,在你脫離尿布之前做過LINQ。曾在微軟的Premier .NET團隊工作過。噓你自己傻瓜! (笑) - 如果你曾經忍受過微軟的採訪,他們會嚷嚷你使用LINQ(我愛)的開銷,而不是僅僅索引到頁面索引器。 – 2012-03-12 14:38:01