2013-07-24 76 views
0

我有一個包含不同類型對象的抽象對象的List<>。 我試圖抓取某一類型的所有物品,並將這些物品設置爲它們自己的List<>從抽象類型列表中獲取某種類型的所有項目

這不是工作 -

//myAbstractItems is a List<myAbstractItem> 
//typeAList inherents from myAbstractItem 


var typeAList = ((List<itemTypeA>)myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).ToList()); 

鑄造(List<itemTypeA>)似乎是失敗的。

+0

如果獲得'itemTypeA'類型的元素或衍生的type_或獲取'itemTypeA'的元素_exactly_? –

回答

5

使用OfType extension method

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList(); 

從文檔...

OfType(IEnumerable)方法僅返回中的那些元素,該元素可以投射到類型TResult

+0

很好的答案BACON!謝謝! –

+0

爲了完整起見,此解決方案具有以下(良好)屬性:**(1)**來自'itemTypeA'的_derived_類型的元素也包含在新列表中。 (這裏'itemTypeA'被稱爲'class'類型,如果它是一個通用的接口類型,泛型委託類型或數組類型,那麼也可以考慮共同和/或逆變。)**(2)**新列表中沒有包含任何運行時類型的'null'條目。 –

0

嘗試使用Where這樣:

var typeAList = myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).Select(item => item as itemTypeA).ToList()) 
+0

而不是最後一個'選擇'你也可以做一個'.Cast ()'。 –

0

一個好的舊線圈,應罰款:

List<itemTypeA> res = new List<itemTypeA>(); 
foreach(var item in myAbstractItems) 
{ 
    itemTypeA temp = item as itemTypeA; 
    if (temp != null) 
    res.Add(temp) 
} 
+1

這與(嘗試的)原始代碼略有不同,因爲它會返回任何可以指定爲「itemTypeA」的東西,而不僅僅是* exact *類型的東西。 – Rawling

+0

你是對的,但代碼和問題不明確的問題^^ –

+0

是的,道歉,我的意思是添加我的評論,你的版本可能是OP *想要的*:p – Rawling

0

這將適用於所有itemTypeA s(以及更多派生類型)。

var typeAList = myAbstractItems.Select(i => i as itemTypeA).Where(i => i != null).ToList(); 

編輯:根據Rawling的評論進行編輯。

+1

爲什麼不把'Select'放在'Where'之前,而不是執行'as'兩次? – Rawling

0

另一種方法可以做到這一點是使用OfType()方法:

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList(); 

這種方法主要執行以下操作:

var typeAList = myAbstractItems.Where(i=>i is itemTypeA).Select(i=>i as itemTypeA).ToList(); 

請記住,這將如果任何元素失敗的源集合是空引用。

+0

最後一個例子會給出一個List 而不是'List ',這就是原始海報正在討論的內容。有趣的是,記住'null'項目發生了什麼,但是。 –

+0

已修改。感謝您指出了這一點。 – KeithS

相關問題