2009-12-31 75 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