2011-09-14 60 views
1

我的代码正在工作,但我试图找到一个更有效的方式来完成此操作。像没有foreach循环的linq解决方案那样会更好。我没有任何性能问题..Linq查找元素和foreach循环

List<Table> tables = getTables(); 
    foreach (TableCategories category in categories) 
    { 
    category.Tables=tables.FindAll(tbl => tbl.CategoryId == category.Id); 
    } 

对于数据库我用纯ADO.NET,因为我使用的是Postgres不LINQ。

+0

“pure ADO.NET not linq”咦? ADO.NET与LINQ有什么关系,这使得你必须使用一个,而不是另一个? – BoltClock

+1

我的意思是我不使用LINQ到SQL,万一有人说我应该在数据库上做点什么。 – GorillaApe

+2

我不建议摆脱这里的foreach。这将有效地在你的查询中有目的地产生副作用,如果你确实... –

回答

6

如何:

var tablesByCategory = getTables().ToLookup(t => t.CategoryId); 
foreach(var category in categories) 
{ 
    category.Tables = tablesByCategory[category.Id]; 
} 

这是更有效的(假设你有很多的表),因为你一开始在O(n)的时间在建立一个查询,然后每个查找for循环是O(1)次,所以你最终得到的是O(m + n)而不是O(m * n)的复杂度。

+0

这就是我想要的!谢谢:)当系统允许我时,我会接受它。我也想做相反的事。为每个表将它与一个类别关联起来。当获取表格时。 – GorillaApe

+0

@Parhs:它也应该在另一个方向上正常工作。因为每个表只有一个类别,所以只需使用'.ToDictionary'而不是'.ToLookup'。 – StriplingWarrior