Wie funktioniert OfType()?Wie funktioniert OfType <T>() arbeiten?
Ich lese this link über das, was los ist, aber wie genau der LINQ-Anbieter weiß, wie alle Objekte abgerufen werden, die dem angegebenen Typ entsprechen. Ich kenne die IQueryable<T>
"Ketten" auf Anfragen und dann bewertet, wenn GetEnumerator()
aufgerufen wird (richtig?).
Insbesondere möchte ich wissen, wie das Framework Vergleich schnell eingeben? Ich schrieb eine Methode in einem .NET 2.0-Projekt, das so ging (seit 2.0 nicht diese Art von Funktionen unterstützen):
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;
}
}
}
Ist dies die beste Umsetzung?
EDIT: Mein Hauptanliegen mit diesem OfType<T>()
ist, dass es schnell ist.
So ist es schneller zu verwenden 'ist' und dann Cast oder ist dies wegen Ihrer Einbeziehung von Werttypen? Ich dachte, mit als und dann auf Null ist schneller? – TheCloudlessSky
Es ist möglich, dass der Unterschied wegen spezifischer Compileroptimierungen irrelevant ist. –
@TheCloudlessSky: Wenn die Methode nur auf Ref-Typen beschränkt war, dann würde ich die 'as/test-for-null-Kombination verwenden, wie Sie es bereits getan haben. Der Geschwindigkeitsunterschied zwischen der Verwendung von 'is'/cast und' as'/test-for-null ist vernachlässigbar, aber wenn diese Stufe der Mikrooptimierung für Sie wichtig ist, schlage ich vor, dass Sie ein Benchmarking durchführen. – LukeH