【问题标题】:(foreach & isAssignableFrom) versus (OfType & foreach) [closed](foreach & isAssignableFrom) 与 (OfType & foreach) [关闭]
【发布时间】:2015-04-10 00:49:51
【问题描述】:

我的问题很简单,这2个代码sn-ps哪个更好?(更快)

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    第二种方法似乎更快,因为您只需循环一次。而第一种方式,因为调用了ToArray,所以会循环两次。

    但是,请注意,OfType 是延迟执行并返回IEnumerable 所以你不需要调用ToArray,它的性能会更好,我发现下面的代码更干净可读:

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

    【讨论】:

      【解决方案2】:

      首先,就性能而言,在第一个 sn-p 中,您仅迭代 Foos,而在第二个实例中,您迭代所有内容并在迭代期间检查它是否为 Foo。

      第二,在可读性方面,如果我找到第二个选项,我会有点惊讶,而第一个是很正常的。

      最后,正如 Peter Duniho 在 cmets 中指出的那样,由于延迟执行,您可以节省完全创建新数组的开销。

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

      【讨论】:

      • 另请注意,简单地使用foreach (Foo foo in foosAndBars.OfType&lt;Foo&gt;()),而不是先将值复制到数组中会更有效和惯用。
      • 反对者,愿意发表评论吗?
      【解决方案3】:

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

      【讨论】:

      • 使用 isAssignableFrom 是因为我经常检查 foo 是实现接口还是从另一个类继承。但是关于 as,请参阅:stackoverflow.com/questions/132445/… 似乎强制转换比 as 语句更可取。
      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2011-01-02
      • 2011-04-23
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多