2015-02-10 26 views
-1

我的問題很簡單,這些2個的代碼片段是更好的?(快)(的foreach&isAssignableFrom)與(OfType及的foreach)

Foo[] foos = foosAndBars.OfType<Foo>().ToArray(); 
foreach(Foo foo in foos) 
{ 
    //Do something 
} 

還是.....

foreach(FooBarParent foo in foosAndBars) 
{ 
    if(typeof(Foo).IsAssignableFrom(foo.GetType())) 
    { 
     //Do something 
    } 
} 

類似的問題:How does OfType() Work?,這是「幾乎」相同,這一個問題:LINQ + Foreach vs Foreach + If

回答

1

首先,在性能方面,在你迭代ONLY FOOS其中的第一個片段在第二種情況下,您正在遍歷所有內容並在迭代期間檢查它是否爲Foo。其次,就可讀性而言,如果我找到第二個選項,我會感到有點驚訝,而第一個選項很正常。

最後,正如Peter Duniho在評論中指出的那樣,您可以節省創建新數組的開銷,這要歸功於延遲執行。

foreach(Foo foo in foosAndBars.OfType<Foo>()) 
{ } 
+1

還請注意,這將是更有效和更地道簡單地使用foosAndBars'的foreach(富富。 OfType ())',而不是先將值複製到數組。 – 2015-02-10 04:30:25

+0

Downvoter,關心評論? – 2015-02-10 21:39:43

2

第二種方法似乎更快,因爲你只是循環一次。而第一種方法,因爲ToArray被調用,所以它會循環兩次。

但是,請注意,OfType是延期執行,並返回IEnumerable,這樣你就不需要調用ToArray,其性能會更好,我發現下面的代碼是更乾淨和可讀性:

var foos = foosAndBars.OfType<Foo>(); 
foreach(Foo foo in foos) 
{ 
    //Do something 
} 
-1

當然,第一個更好。但是我仍然建議你使用asis驗證來做一些事情。

第一種方法

 object[] foosAndBars = new object[10];    
     foreach (var foo in foosAndBars) 
     { 
      if (foo is Foo) 
      { 
       // Do Something 
      } 
     } 

第二種方法

 foreach (var foo in foosAndBars) 
     { 
      Foo objFoo = foo as Foo; 
      if (objFoo != null) 
      { 
       // Do Something 
      } 
     } 
+0

使用isAssignableFrom是因爲我經常檢查foo是否實現接口或從另一個類繼承。但關於as,請參閱:http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator它似乎是鑄造比as語句更受歡迎。 – Adrian773 2015-02-10 20:07:02