linq - 使用 LINQ 进行编码是如何工作的?幕后会发生什么?

标签 linq clr

例如:

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/

相关文章:

c# - C# 垃圾收集器如何找到唯一引用是内部指针的对象?

c# - 两个列表 - 获取公共(public)字段?

linq - EF4 LINQ Include(string) 替代硬编码字符串?

visual-studio - 将弃用/clr :oldSyntax supported in VS2005 and VS2008 still work with VS2010?

c# - 将基类中最复杂的方法声明为虚方法

c# - 我如何获得对所有托管线程的引用

c# - 通过 SOS 调查 CLR

c# - 将 foreach 转换为 LINQ 以进行练习和学习

c# - 使用 LINQ toSQL 从存储过程返回新插入的行 ID

c# - 比较两个列表中对象的 id,并获取包含 id 出现在两个列表中的对象的对象列表