(foreach& isAssignableFrom)与(OfType& foreach)

时间:2015-02-10 04:19:16

标签: c#

我的问题很简单,这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

3 个答案:

答案 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)

当然,第一个更好。但我仍然建议您使用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
            }
        }