2

假設我知道設計時的類型,有沒有辦法從IEnumerable得到IEnumerable<T>沒有reflection如何從IEnumerable轉換爲IEnumerable <T>?

我有這個

foreach(DirectoryEntry child in de.Children) 
{ 
    // long running code on each child object 
} 

我試圖使並行化,像這樣

Parallel.ForEach(de.Children, 
    (DirectoryEntry child) => { // long running code on each child }); 

但是這並不工作,因爲de.Children是DirectoryEntries類型。它執行IEnumerable而不是IEnumerable<DirectoryEntry>

回答

6

達到此目的的方法是使用.Cast<T>() extension method

Parallel.ForEach(de.Children.Cast<DirectoryEntry>(), 
    (DirectoryEntry child) => { // long running code on each child }); 

另一種方法是使用.OfType<T>() extension method

Parallel.ForEach(de.Children.OfType<DirectoryEntry>(), 
    (DirectoryEntry child) => { // long running code on each child }); 

.Cast<T>().OfType<T>()

的OfType(IEnumerable的)方法返回僅在該可轉換爲類型TResult 源那些元件之間的微妙不同。如果元素無法轉換爲輸入TResult,則要接收 異常,請使用 Cast(IEnumerable)。

- MSDN

此鏈接on the MSDN forums讓我去正確的方向。

+0

您還可以使用'OfType ' –

+0

@KooKiz一個很好的觀點,我會更新我的答案。 – Nate

+3

@KooKiz:但無論如何,如果你知道每個元素都是'DirectoryEntry',那就毫無意義。 'OfType'過濾和轉換,所以如果你需要過濾使用'OfType',否則'Cast'。 –

相關問題