我正在查看一些代码,需要IEnumerable<T> http://msdn.microsoft.com/en-us/library/9eekhta0.aspx并将其转换为List<T> http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx所以它可以使用List<T>.Find(predicate) http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx:
var myEnumerable = ...;
var myList = new List<T>(myEnumerable);
var match = myList.Find(value => value.Aaa == aaa && value.Bbb == bbb);
有没有办法使用重写这个LINQ 扩展方法 http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx具有相同的效果,但无需构建额外的List<T>
作为中间步骤?
The FirstOrDefault(source, predicate) http://msdn.microsoft.com/en-us/library/bb549039.aspx扩展方法看起来是一个不错的候选者,但试图弄清楚它是否是exactly相当于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 的Where
and Select
使用延迟执行,同时FindAll
and ConvertAll
of List<>
将立即执行并返回对新的引用List<>
实例。
FindLast
通常会比LastOrDefault
因为FindLast
实际上是从末尾开始搜索List<>
。另一方面LastOrDefault(predicate)
始终遍历整个序列(从第一项开始),然后才返回最近的匹配项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)