2010-05-14 8 views
7

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.

Antwort

10

Ihre aktuelle Implementierung - von Entwurf - unterstützt keine Werttypen.

Wenn Sie OfType Methode ist etwas näher an LINQ, wollen, dass alle Arten unterstützt, dies versuchen:

public IEnumerable<TResult> OfType<TResult>(IEnumerable source) 
{ 
    foreach (object item in source) 
    { 
     if (item is TResult) 
      yield return (TResult)item; 
    } 
} 
+0

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

+0

Es ist möglich, dass der Unterschied wegen spezifischer Compileroptimierungen irrelevant ist. –

+0

@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

0

Es sieht aus wie eine gute Implementierung für mich, aber es sieht Art der Implementierung spezifisch aus (Sie beziehen sich auf diese.InnerList). Wenn Sie eine Erweiterungsmethode erstellt haben (die in 2.0 unterstützt wird, ist das nicht so?), Die IEnumerable erweitert, könnten Sie sie in jeder aufzählbaren Sammlung verwenden, oder?

+0

Der InnerList ist eigentlich eine ‚Liste ‘. Auch bei der Arbeit können wir VS2008 (ugh ...) nicht verwenden, so dass wir 2.0 mit dem 3.5-Compiler nicht anvisieren können. Also nein, ich kann keine Erweiterungsmethode verwenden. – TheCloudlessSky

Verwandte Themen