如何从IEnumerable转换为IEnumerable <T>?

Nat*_*ate 2 c# parallel-processing active-directory task-parallel-library

假设我在设计时知道类型,IEnumerable<T>IEnumerable没有办法从无反射中得到一个?

我有这个

foreach(DirectoryEntry child in de.Children)
{
   // long running code on each child object
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试启用并行化,就像这样

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

但这不起作用,因为de.Children属于类型DirectoryEntries.它实现IEnumerable但不实现IEnumerable<DirectoryEntry>.

Nat*_*ate 6

实现此目的的.Cast<T>()方法是使用扩展方法.

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

实现此目的的另一种方法是使用.OfType<T>()扩展方法.

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

.Cast<T>()和之间有一个微妙的区别.OfType<T>()

OfType(IEnumerable)方法仅返回源中可以强制转换为TResult类型的元素.要在不能将元素强制转换为类型TResult的情况下接收异常,请使用Cast(IEnumerable).

- MSDN

MSDN论坛上的这个链接让我走向了正确的方向.

  • @KooKiz:但是如果你知道每个元素都是一个`DirectoryEntry`那么毫无意义.`OfType`过滤器和强制转换,所以如果你需要过滤使用`OfType`,否则`Cast`. (3认同)