LINQ相当于List <T> .Find()?

Joe*_*ite 8 c# linq

我正在查看一些代码,IEnumerable<T>并将其转换为一个代码,List<T>以便它可以使用List<T>.Find(predicate):

var myEnumerable = ...;
var myList = new List<T>(myEnumerable);
var match = myList.Find(value => value.Aaa == aaa && value.Bbb == bbb);
Run Code Online (Sandbox Code Playgroud)

有没有办法使用具有相同效果的LINQ扩展方法重写它,但没有构建额外List<T>的中间步骤?

FirstOrDefault(source, predicate)扩展方法看起来像一个很好的候选人,而是试图弄清楚它是否正好等同于Find正在我的头不疼.

Jep*_*sen 19

仅供参考,下面是一些旧的.NET 2样式List<>实例方法的表,以及它们在Linq中的等效扩展方法:

METHOD IN List<>                              METHOD IN Linq
------------------------------------------------------------------------------------------

list.Contains(item)                           query.Contains(item)

list.Exists(x => x.IsInteresting())           query.Any(x => x.IsInteresting())
list.TrueForAll(x => x.IsInteresting())       query.All(x => x.IsInteresting())

list.Find(x => x.IsInteresting())             query.FirstOrDefault(x => x.IsInteresting())
list.FindLast(x => x.IsInteresting())         query.LastOrDefault(x => x.IsInteresting())

list.FindAll(x => x.IsInteresting())          query.Where(x => x.IsInteresting())

list.ConvertAll(x => x.ProjectToSomething())  query.Select(x => x.ProjectToSomething())
Run Code Online (Sandbox Code Playgroud)

当然,其中一些并不完全等同.特别的LINQ的WhereSelect使用延迟执行,而FindAllConvertAllList<>将立即执行,并返回一个引用新的List<>实例.

FindLast通常会比快LastOrDefault,因为FindLast实际上从搜索的末尾开始List<>.另一方面,LastOrDefault(predicate)总是贯穿整个序列(从第一个项目开始),然后才返回最"最近"的匹配.


Ree*_*sey 10

LINQ equivelent将使用FirstOrDefault:

var match = myEnumerable.FirstOrDefault(value => value.Aaa == aaa && value.Bbb == bbb);
Run Code Online (Sandbox Code Playgroud)