2011-10-10 57 views
4

我有一個控件,RadTabStrip,其中包含:public RadTabCollection Tabs { get; }。類RadTabCollection繼承自:public class RadTabCollection : ControlItemCollection, IEnumerable<RadTab>, IEnumerable更清潔的方式將集合轉換爲另一種類型?

現在,我有一個CormantRadTab列表。此類繼承:public class CormantRadTab : RadTab, ICormantControl<RadTabSetting>

我的目標是使用RadTabCollection填充CormantRadTab的列表。目前,我有這樣的實現:

List<CormantRadTab> oldTabs = new List<CormantRadTab>(Tabs.Count); 
foreach(CormantRadTab tab in Tabs) 
{ 
    oldTabs.Add(tab); 
} 

我真的覺得我應該可以做一些事情,如:

List<CormantRadTab> oldTabs = new List<CormantRadTab>(Tabs.AsEnumerable<RadTab>()); 

但這並不匹配超載簽名新建列表期待。如果我嘗試投射AsEnumerable CormantRadTab,則會收到其他錯誤。

什麼是做到這一點的正確方法?

回答

8

您可以使用Enumerable.Cast<>

var oldTabs = Tabs.Cast<CormantRadTab>().ToList(); 

或者有一些非CormantRadTab元素,你只需要選擇CormantRadTab的,使用OfType<>

var oldTabs = Tabs.OfType<CormantRadTab>().ToList(); 

(在這兩種情況下,結果將是List<CormantRadTab>類型 - 使用明確的打字或隱式打字,無論你喜歡什麼。)

+0

謝謝,Jon Skeet! –

3

有你試過 - var oldTabs = Tabs.OfType<CormantRadTab>().ToList();

+1

呃哦現在我必須刪除這個答案,然後Jon Skeet告訴我爲什麼OfType在這裏毫無意義。 (或者不是,:)。) –

+1

這不是沒有意義的,但是我個人更喜歡'Cast',這樣如果有*意外的*非CormantRadTab值,我會看到一個異常,而不是默默地忽略這些值。 –

+0

啊,我其實沒有考慮到*那可能性。謝謝。 –

相關問題