我正在查看一些代码,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的Where
和Select
使用延迟执行,而FindAll
和ConvertAll
的List<>
将立即执行,并返回一个引用新的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)