C# (foreach&;isAssignableFrom)与(OfType&;foreach)
我的问题很简单,这两段代码中哪一段更好?(更快)C# (foreach&;isAssignableFrom)与(OfType&;foreach),c#,C#,我的问题很简单,这两段代码中哪一段更好?(更快) 类似的问题:这个问题“几乎”与这个问题相同:首先,在性能方面,在第一个代码片段中,您只迭代Foo,而在第二个实例中,您迭代所有内容,并在迭代过程中检查它是否是Foo 第二,在可读性方面,如果我发现第二个选项,我会有点惊讶,而第一个选项是很正常的 最后,正如Peter Duniho在评论中指出的,由于延迟执行,您可以完全节省创建新数组的开销 foreach(Foo foo in foosAndBars.OfType<Foo>()) {
类似的问题:这个问题“几乎”与这个问题相同:首先,在性能方面,在第一个代码片段中,您只迭代Foo,而在第二个实例中,您迭代所有内容,并在迭代过程中检查它是否是Foo 第二,在可读性方面,如果我发现第二个选项,我会有点惊讶,而第一个选项是很正常的 最后,正如Peter Duniho在评论中指出的,由于延迟执行,您可以完全节省创建新数组的开销
foreach(Foo foo in foosAndBars.OfType<Foo>())
{ }
foreach(foosandbar.OfType()中的Foo-Foo)
{ }
第二种方法似乎更快,因为您只需循环一次。第一种方法,因为调用了ToArray
,所以它将循环两次
但是,请注意,类型的是延迟执行的,并返回IEnumerable
,因此您不需要调用到阵列
,它的性能会更好,我发现下面的代码更清晰可读:
var foos = foosAndBars.OfType<Foo>();
foreach(Foo foo in foos)
{
//Do something
}
var foos=foosandbar.OfType();
foreach(Foo-Foo-in-foos)
{
//做点什么
}
当然,第一个更好。但我仍然建议您使用as
或is
验证来做一些事情
第一种方法
第二种方法
还要注意的是,简单地使用foreach(foosandbar.OfType()中的Foo-Foo)
,而不是先将值复制到数组中,会更有效、更习惯,因为我经常检查Foo是实现了接口还是从另一个类继承。但是关于as,请参见:似乎铸造比as声明更可取。
foreach(Foo foo in foosAndBars.OfType<Foo>())
{ }
var foos = foosAndBars.OfType<Foo>();
foreach(Foo foo in foos)
{
//Do something
}
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
}
}