How does OfType<T>() Work?
How does OfType() Work?
I read this link about what's going on but how exactly does the LINQ provider know how to get all objects matching the specified type. I know the IQueryable<T>
"chains" up requests and then evaluates when GetEnumerator()
is called (right?).
Specifically I want to know how does the framework quickly do type comparison? I wrote a method in a .NET 2.0 project that went like this (since 2.0 doesn't support these kind of features):开发者_如何转开发
public IEnumerable<TResult> OfType<TResult>()
where TResult : class
{
foreach (TItem item in this.InnerList)
{
TResult matchItem = item as TResult;
if (matchItem != null)
{
yield return matchItem;
}
}
}
Is this the best implementation?
EDIT: My main concern with this OfType<T>()
is that it is fast.
Your current implementation -- by design -- doesn't support value-types.
If you wanted something closer to LINQ's OfType
method, that supports all types, then try this:
public IEnumerable<TResult> OfType<TResult>(IEnumerable source)
{
foreach (object item in source)
{
if (item is TResult)
yield return (TResult)item;
}
}
It looks like a good implementation to me, but it looks kind of implementation specific (you are referring to this.InnerList). If you created an extension method (that's supported in 2.0 is it not?) that extends IEnumerable, you would be able to use it on any enumerable collection, would you not?
精彩评论