2011-10-10 53 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

啊,我其实没有考虑到*那可能性。谢谢。 –

相关问题