2010-05-14 13 views
7

OfType() nasıl çalışır?OfType <T>() Nasıl Çalışır?

Neler olup bittiğini, ancak LINQ sağlayıcısının, belirtilen türle eşleşen tüm nesneleri nasıl alacağını tam olarak nasıl bildiğine dair this link numarasını okudum. IQueryable<T> "zincirler" yukarı isteklerini biliyorum ve GetEnumerator() çağrıldığında değerlendirir (sağ?).

Özellikle, çerçevenin hızlı bir şekilde nasıl karşılaştırılacağını bilmek ister misiniz?

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; 
      } 
     } 
    } 

bu en iyi uygulama mı: I (özelliklerin bu tür desteklemez 2.0 beri) böyle gitti bir .NET 2.0 projede bir yöntem yazdı?

DÜZENLEME: Bu OfType<T>() Benim asıl sorun o hızlı olmasıdır.

cevap

10

Geçerli uygulamanız - tasarıma göre - değer türlerini desteklemiyor.

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

Yani '' 'kullanmak daha hızlıdır ve daha sonra değer türleri dahil olmanız nedeniyle döküm ya da budur? Kullanmayı düşündüm ve sonra boşluğun daha hızlı olduğunu kontrol ettim? – TheCloudlessSky

+0

Belirli derleyici optimizasyonları nedeniyle farkın alakasız olması mümkündür. –

+0

@TheCloudlessSky: Metot, yalnızca ref türleri ile uğraşmak zorunda kalsaydı, o zaman yaptığınız gibi "as'/test-for-null" kombinasyonunu kullanırdım. 'Is'/cast ve' as'/test-for-null kullanımı arasındaki hız farkı ihmal edilebilir, ancak bu mikro optimizasyon seviyesi sizin için önemliyse, o zaman bazı kıyaslamalar yapmanızı öneririm. – LukeH

0

Bana iyi bir uygulama gibi görünüyor, ancak belirli bir uygulamaya benziyor (buna atıfta bulunuyorsunuz. InnerList). IEnumerable'ı genişleten bir uzantı yöntemi oluşturduysanız (2.0'da desteklenmiyor mu?), Herhangi bir sayısız koleksiyonda kullanabilirsiniz, değil mi?

+0

InnerList aslında bir 'Liste ' is:

Eğer, o zaman bu deneyin her tür destekler LINQ en OfType yöntem yakın bir şey isteseydim. Ayrıca işte VS2008'i (ugh ...) kullanamıyoruz, böylece 3.5 derleyicisiyle 2.0'ı hedefleyemiyoruz. Yani hayır, bir uzantı yöntemi kullanamıyorum. – TheCloudlessSky