为什么.ToList()与Cast相比是一个瓶颈?示例代码如下

Pau*_*ber 2 c#

http://codepaste.net/4xzv9k 是显示C#代码的codepaste链接(很抱歉,我无法让代码看到这里)

我的问题是为什么像下面这样的简单查询比强制转换而不是.ToList扩展要快得多:

    //fast:
        for (int i = 0; i < iterations; i++)
        {
              var queryShortWay1 = productList.OrderBy(a => a.ProductName).Where(a =>
                a.ProductName.Length < 99);

            mySecondProductLst = queryShortWay1 as List<Product>; //fast CAST  


        }

    //slow:

        for (int i = 0; i < iterations; i++)
        {
            var queryLongWay1 = productList.OrderBy(a => a.ProductName).Where(a =>
              a.ProductName.Length < 99);
            MyProductList = queryLongWay1.ToList();  //slow 

        }
Run Code Online (Sandbox Code Playgroud)

你会认为.ToList并不是那么慢,但它至少要一个数量级.有什么原因?

lc.*_*lc. 5

我想第一个是快速的,因为它只是设置mySecondProductLstnull因为queryShortWay1不是List<Product>(它很可能是类型IQueryable<Product>IEnumerable<Product>).此处不执行查询.

第二个"慢"示例实际上是执行您的查询.

这里真正的关键是LINQ查询执行是延迟的 - 这意味着查询在迭代之前不会被实际执行,无论是通过循环,调用ToList()还是其他方式.也就是说,设置变量queryShortWay1,并queryLongWay1不能单独导致查询执行.