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可能更适合