2009-12-31 37 views
3

我已经得到了继承Object2D(DisplayObject2D比如)一个抽象类(Object2D),和几个班级C# - 遍历列表中给定类型的元素<T>

我用一个列表来存储这些所有引用对象。

我想循环访问此列表中的每个DisplayObject2D。

到目前为止,下面的代码工作,但作为新的C#开发,我想知道,如果没有任何更好的做法是这样做的:

List<Object2D> tmp = objects.FindAll(delegate(Object2D obj) 
             { return obj is DisplayObject2D; }); 
foreach(DisplayObject2D obj in tmp) 
{ 
    ... 
} 

提前感谢!

+1

@ZedK:+1好问题:与我正在处理的事情有关系。我敢肯定,你意识到你可以直接在foreach循环中使用George的答案,但我会提及它,以防万一:foreach(object.OfType中的Object2D obj ()){...}:of当然,你可能还有其他的理由在'tmp中保存已过滤的对象,所以你可能不想'按照类型'开火和忘记'过滤的结果。 – BillW 2009-12-31 11:06:27

+0

是的,这就是我刚才所做的(在添加缺少的“使用System.Linq”语句之后),所有内容都只在一行中完成,非常完美。谢谢! – 2009-12-31 11:31:52

回答

13
var objects2d = objects.OfType<DisplayObject2D>(); 

如果你想要一个IEnumerable

var listOfObjects2d = objects2d.ToList(); 

如果你想有一个列表

注意OfType会给你一个更具体的类型

IEnumerable<DisplayObject2D> 

如果不是你预计,使用Cast扩展将其转换回可枚举的基类型。

var listOfObjects2dFilteredByMoreSpecificType = 
objects.OfType<DisplayObject2D>.Cast<Object2D>() 
//.ToList() // until you really need an IList<T> better leave it just an enumerable 
; 
+1

@George +1,谢谢;你的回答解决了我在使用'OfType ...时遇到的一个麻烦......我在最后省略了空的零部件。 – BillW 2009-12-31 11:03:25

+0

其实,“对象”是一个列表,似乎OfType方法不存在(它不会出现在自动完成窗口中)=/ 我一直在MSDN中寻找“OfType”,但我并没有真正理解如何使用它。 – 2009-12-31 11:23:12

+3

要使用它,你必须声明使用System.Linq命名空间和对System.Core DLL的引用。 – 2009-12-31 11:26:52