1

采用以下伪 C# 代码:

using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;

public IEnumerable<IDataRecord> GetRecords(string sql)
{
     // DB logic goes here
}

public IEnumerable<IEmployer> Employers()
{
     string sql = "select EmployerID from employer";
     var ids = GetRecords(sql).Select(record => (record["EmployerID"] as int?) ?? 0);
     return ids.Select(employerID => new Employer(employerID) as IEmployer);
}

如果两个 Select() 调用结合起来会更快吗?上面的代码中是否有额外的迭代?下面的代码更快吗?

public IEnumerable<IEmployer> Employers()
{
     string sql = "select EmployerID from employer";
     return GetRecords(sql).Select(record => new Employer((record["EmployerID"] as int?) ?? 0) as IEmployer);
}

如果性能没有差异,我认为第一个示例更具可读性。

4

2 回答 2

2

没有显着差异。两种方法都返回一个表达式,该表达式可以遍历 GetRecords 的结果。

它们并不相同,因为第一个链接了 Select,但它们仍然会以相同的顺序完成相同的工作。当循环链接的 Selects 时,第二个 select 将根据需要从第一个 Select 中放置一个和一个项目,第一个 Select 不必在第二个 Select 可以使用结果之前完成。

于 2010-05-04T05:36:57.637 回答
0

没有区别。

LINQ 使用延迟评估的思想source。我将引用相关部分:

为了解决这个问题,所有内置的 LINQ 提供程序都使用了一个称为延迟执行的概念。不是让查询运算符立即执行,它们都简单地返回实现 IEnumerable(of T) 接口的类型。然后,这些类型会延迟执行,直到在 for each 循环中实际使用查询。

基本上,在您使用Employers()in a foreachor .ToList()etc 的结果之前,它实际上并没有完成任何工作。

于 2010-05-04T05:18:30.463 回答