如何从IEnumerable转换为IEnumerable <t>?</t>

时间:2012-10-31 16:40:58

标签: c# active-directory parallel-processing task-parallel-library

假设我在设计时知道类型,是否有办法从IEnumerable<T>获得IEnumerable而不是reflection

我有这个

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>

1 个答案:

答案 0 :(得分: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,则使用异常   铸(IEnumerable的)。

- MSDN

此链接on the MSDN forums让我走向正确的方向。