我的问题很简单,这2个代码片段中的哪一个更好?(更快)
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
答案 0 :(得分:2)
第二种方法似乎更快,因为你只循环了一次。第一种方法是因为ToArray
被调用,所以它会循环两次。
但请注意,OfType
是延迟执行并返回IEnumerable
因此您不需要致电ToArray
,其效果会更好,我发现如下代码更干净,更易读:
var foos = foosAndBars.OfType<Foo>();
foreach(Foo foo in foos)
{
//Do something
}
答案 1 :(得分:1)
首先,就性能而言,在第一个片段中,您将迭代ONLY Foos,而在第二个实例中,您将迭代所有内容并在迭代期间检查它是否为Foo。
其次,就可读性而言,如果我找到第二个选项,我会有点惊讶,而第一个选项很正常。
最后,正如Peter Duniho在评论中指出的那样,由于延迟执行,你可以节省自己创建新数组的开销。
foreach(Foo foo in foosAndBars.OfType<Foo>())
{ }
答案 2 :(得分:-1)
当然,第一个更好。但我仍然建议您使用as
或is
验证来执行某些操作。
第一种方法
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
}
}