gpt4 book ai didi

c# - LINQ 等效于 List.Find()?

转载 作者:太空狗 更新时间:2023-10-29 18:02:25 24 4
gpt4 key购买 nike

我正在查看一些采用 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);

有没有办法使用 LINQ extension methods 重写它具有相同的效果,但无需构建额外的 List<T>作为中间步骤?

FirstOrDefault(source, predicate) 扩展方法看起来是个不错的选择,但试图弄清楚它是否完全等同于Find让我头疼。

最佳答案

仅供引用,这是一些旧的 .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())

当然其中有些并不完全等同。特别是 Linq 的 WhereSelect使用延迟执行,同时 FindAllConvertAllList<>将立即执行并返回对新 List<> 的引用实例。

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

关于c# - LINQ 等效于 List<T>.Find()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com