我正在查看一些采用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)
扩展方法看起来是一个很好的候选者,但是试图弄清楚它是否与<{1}}完全相同让我头痛。
答案 0 :(得分:18)
仅供参考,下面是一些旧的.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的Where
和Select
使用延迟执行,而FindAll
的{{1}}和ConvertAll
将立即执行并返回对新的引用List<>
实例。
List<>
通常会比FindLast
更快,因为LastOrDefault
实际上是从FindLast
开始搜索的。另一方面,List<>
总是贯穿整个序列(从第一个项目开始),然后才返回最多的&#34;最近的&#34;匹配。
答案 1 :(得分:10)
LINQ equivelent将使用FirstOrDefault:
var match = myEnumerable.FirstOrDefault(value => value.Aaa == aaa && value.Bbb == bbb);
答案 2 :(得分:1)
或者你可以采取以下方式:
var match = myEnumerable.Where(value => value.Aaa == aaa && value.Bbb == bbb)
.FirstOrDefault();