例如:
m_lottTorqueTools = (From t In m_lottTorqueTools _
Where Not t.SlotNumber = toolTuple.SlotNumber _
And Not t.StationIndex = toolTuple.StationIndex).ToList
这里发生了什么算法?后台是否有嵌套的 for 循环?它是否为这些字段构建了一个哈希表?我很好奇。
最佳答案
查询表达式通常被翻译成扩展方法调用。 (它们必须是,但 99.9% 的查询使用 IEnumerable<T>
或 IQueryable<T>
。)
该方法所做的确切算法因方法而异。您的示例查询不会使用任何哈希表,但例如连接或分组操作会使用。
简单的Where
call 在 C# 中转换为类似的东西(使用迭代器 block ,据我所知,目前在 VB 中不可用):
public static IEnumerable<T> Where(this IEnumerable<T> source,
Func<T, bool> predicate)
{
// Argument checking omitted
foreach (T element in source)
{
if (predicate(element))
{
yield return element;
}
}
}
谓词作为委托(delegate)(如果您使用 IQueryable<T>
,则作为表达式树)提供,并在序列中的每个项目上调用。结果是流式传输的,执行被延迟 - 换句话说,在您开始从结果中请求项目之前,什么都不会发生,即使这样,它也只会做它需要做的事情以提供下一个结果。一些运算符没有被延迟(基本上是返回单个值而不是序列的运算符)并且一些缓冲输入(例如 Reverse
必须读取到序列的末尾才能返回任何结果,因为最后一个结果它读取的是它必须产生的第一个)。
恐怕要提供每个 LINQ 运算符的详细信息超出了单一答案的范围,但如果您对具体问题有疑问,我相信我们可以提供帮助。
如果您使用 LINQ to SQL 或其他基于 IQueryable<T>
的提供程序,我应该补充一点。 , 情况大不相同。 Queryable
类构建查询(在提供者的帮助下,它实现了 IQueryable<T>
开始),然后查询通常被提供者翻译成更合适的形式(例如 SQL)。确切的细节(包括缓冲、流媒体等)将完全取决于提供者。
关于linq - 使用 LINQ 进行编码是如何工作的?幕后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835569/