2013-04-23 107 views
1

我是linq的新手,我正在編寫一個我相信可以改進的過程。LINQ - 從db中選擇並比較兩個列表

簡單起見:
我得到一個對象列表。
我檢查一個數據庫表中哪個對象在數據庫中有一行。
我返回對象的列表與aditional布爾存在/不存在。

我有以下簡單的POCO

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

通知並非總是我有一個ID,併爲此我應該跳過此對象。
(奇怪,但是這僅僅是非常接近我在現實生活中的要求)

這裏是我的代碼 - 需要改進:

// 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; 

回答

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(); 
+0

yepp,這是一個很好的說明。沒有linq相關,但很重要。 – Jeb 2013-04-23 12:24:42

+0

@rails:我沒有看到任何問題,所以我盡我所能幫助你:) – 2013-04-23 12:32:13