将集合转换为另一种类型的更简洁方法?

4
我有一个控件RadTabStrip,它包含:public RadTabCollection Tabs { get; }。类RadTabCollection继承自:public class RadTabCollection : ControlItemCollection, IEnumerable, IEnumerable。
现在,我有一个CormantRadTab列表。这个类继承自:public class CormantRadTab : RadTab, ICormantControl 我的目标是用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>());

但是这与重载签名 New List 所期望的不匹配。如果我尝试将 AsEnumerable 强制转换为 CormantRadTab,我会收到其他错误提示。
正确的方法是什么?
2个回答

8
您可以使用 Enumerable.Cast<> 方法:
var oldTabs = Tabs.Cast<CormantRadTab>().ToList();

如果存在一些非CormantRadTab元素,而您只想选择CormantRadTab元素,请使用OfType<>

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

在这两种情况下,结果的类型都将是 List<CormantRadTab>。您可以使用显式或隐式类型,任选其一。

3

你试过这个吗 - var oldTabs = Tabs.OfType<CormantRadTab>().ToList();


(注意:没有解释)

1
哎呀,现在我必须在Jon Skeet告诉我OfType在这里毫无意义之前删除这个答案。 (或者不用,呵呵。 :) ) - Kevin Stricker
1
这并不是毫无意义的,但就个人而言,我更喜欢使用 Cast,这样如果出现意外的非CormantRadTab值,我会看到异常而不是默默地忽略这些值。 - Jon Skeet
啊,我实际上没有考虑过那种可能性。谢谢。 - Kevin Stricker
我只是想要做到.OfType<>所能做的事情 - 获取你感兴趣类型的项目。比我的以前方法要干净得多,它使用了一些.Where来获取我所需类型的元素,然后跟着一个.Cast<> - Richard Ev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接