LINQ - 从db中选择并比较两个列表

时间:2013-04-23 12:02:11

标签: c# linq

我是linq的新手,我正在编写一个我认为可以改进的流程。

简单说明:
   我得到了一个对象列表    我在db表中检查哪个对象在数据库中有一行    我返回一个对象列表,其中存在aditional boolean存在/不存在。

我有以下简单的POCO

public class Project  
{
   public Guid? Id {get; set;}
   public string name {get; set;}
}

注意并不总是我有一个id,因此我应该跳过这个对象 (奇怪但这只是非常接近我对reallife的要求)

这是我的代码 - 需要改进:

// Get List OF Project Guids
List<Project> ProjectList = GetProjects()
IEnumerable<Guid?> projectsIDs = from package in packages select package.Key;
List<Guid?> prjGuidsList = projectsIDs.ToList();

// Sends the list of Guids and return only the one that exists in the db
// will be implemented with select.. where.. in..
List<Guid?> dbProjects = FilterSharedVersions(prjGuidsList);


// create a new object that will contain the true false value
List<ProjectsToken> tokens = packages.Select(subject => new ProjectsToken
 {
  Id = subject.id
  MetaKey = subject.Name,
  exists = dbProjects.contains(subjecy.id)
 }    
).ToList();

return tokens;

1 个答案:

答案 0 :(得分:3)

List类的Contains方法在O(n)中的表现非常差。您需要构建一个HashSet,然后方法Contains将在O(1)中执行。

var dbProjects = new HashSet<Guid?>(FilterSharedVersions(prjGuidsList));
var tokens = packages.Select(subject => new ProjectsToken
 {
     Id = subject.id
     MetaKey = subject.Name,
     exists = dbProjects.Contains(subjecy.id)
 }    
).ToList();