LINQ等效于List <t> .Find()?</t>

时间:2011-06-29 23:28:19

标签: 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);

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

FirstOrDefault(source, predicate)扩展方法看起来是一个很好的候选者,但是试图弄清楚它是否与<{1}}完全相同让我头痛。

3 个答案:

答案 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的WhereSelect使用延迟执行,而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();