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'。 –

相关问题