我想知道如何实现LINQ Where()。它是否对集合执行简单的线性搜索?或者是否实施了任何优化?
答案 0 :(得分:4)
简短回答:取决于。
更长的答案:LINQ的目的是允许开发人员表达查询的 intent ,而无需提供 将如何执行查询。我们可以对几乎任何可以表示为集合的内容使用相同的查询语法。
对于LINQ to Objects,它目前只是执行您所描述的 - 序列的线性遍历。 LINQ可以使用IQueryProvider
将如何推迟到更复杂的实现。
提供者的工作是将查询(例如,Where(predicate)
)转换为实际执行代码。对于像实体框架中的LINQ to SQL或LINQ to Entities之类的东西,它将查询转换为SQL并执行它。
所以在基本层面上,这个想法是“它无关紧要”它是如何工作的 - 它应该通过更具说明性地编写查询来帮助开发人员提高工作效率。但查找您正在使用的特定LINQ提供程序的文档很有帮助,因此您可以了解如何最有效地利用它。
答案 1 :(得分:2)
正如MSDN documentation所说:
LINQ为查询和引入了标准的,易于学习的模式 更新数据,和技术可以扩展到支持 可能是任何类型的数据存储。
因此,Where
函数的工作原理取决于集合下使用的LINQ提供程序。 LINQ to对象将执行类似于您所说的搜索,而LINQ to Entities将把它转换为SQL WHERE子句并在数据库上执行它以返回对象。
答案 2 :(得分:2)
它只是迭代:
foreach (TSource element in source) {
if (predicate(element)) yield return element;
}