2015-02-10 63 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