Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 关于对象集合的FirstOrDefault_C#_Linq - Fatal编程技术网

C# 关于对象集合的FirstOrDefault

C# 关于对象集合的FirstOrDefault,c#,linq,C#,Linq,我有以下几节课: public class Animal { ... } public class Cow : Animal { ... } public class AnimalCollection : List<Animal> { public Animal GetFirstAnimal<T>() { foreach(Animal animal in this) { if(an

我有以下几节课:

public class Animal
{
    ...
}

public class Cow : Animal
{
    ...
}

public class AnimalCollection : List<Animal>
{
    public Animal GetFirstAnimal<T>()
    {
        foreach(Animal animal in this)
        {
            if(animal is T)
                return T as Animal
        }

        return null;
    }
}
公共类动物
{
...
}
公营牛:动物
{
...
}
公共类动物采集:列表
{
公共动物
{
foreach(本书中的动物)
{
如果(动物是T)
将T作为动物返回
}
返回null;
}
}
有几个问题: 是否可以对集合使用FirstOrDefault而不是使用GetFirstAnimal()方法?如果可以,语法是什么?还有,哪一种效率最高?这不会是一个庞大的收藏

或者,有没有更好的方法一起做同样的事情?

var firstCow=animals.OfType().FirstOrDefault();
var firstCow = animals.OfType<Cow>().FirstOrDefault();

除了使用类型为的
来实际迭代整个列表之外,您还可以使用
FirstOrDefault的重载
并传入谓词:

var firstAnimal = animals.FirstOrDefault( x => x is Animal ) as Animal;

编辑:正如@Lee在评论中正确指出的那样,
类型的
不会迭代整个列表;相反,类型的
只会迭代集合,直到匹配
FirstOrDefault
谓词。

仅供参考,这不是类的集合,而是对象的集合。时间太晚了,我有人流感,是否已编辑以更正?SingleOrDefault是否还必须迭代整个列表,以确保符合谓词的项不超过一个?是-我的不好。Mean FirstOrDefault。
of type
不会迭代整个列表,它与
FirstOrDefault
@Lee一样懒惰-非常清楚!一点MSDN和一个快速测试。。。OfType不会迭代整个列表。相反,OfType只会根据需要进行迭代,直到满足FirstOrDefault的谓词为止。@MetroSmurf:我还是不明白。由于
animals
是一个
列表
FirstOrDefault
将返回一个静态类型为
Animal
的值。是的,动态类型可能是动物的一个子类型,但是强制类型转换只会改变静态类型(这已经是正确的)。是的-我确实是指FirstOrDefault。谢谢,这正是我想要的。虽然我最初的想法是将FirstOrDefault与谓词一起使用,但现在我认为使用of type可能更适合