Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (foreach&;isAssignableFrom)与(OfType&;foreach)_C# - Fatal编程技术网

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
            }
        }