2013-07-02 50 views
0

我有這將父集合的子集,以適當的父母映射方法應用子集匹配父母父集合的

public static void ApplyParentChild<TParent, TChild, TId>(
      this IEnumerable<TParent> parents, IEnumerable<TChild> children, 
      Func<TParent, TId> id, Func<TChild, TId> parentId, 
      Action<TParent, TChild> action 
     ) 
    { 
     var lookup = parents.ToDictionary(id); 
     foreach (var child in children) 
     { 
      TParent parent; 
      if (lookup.TryGetValue(parentId(child), out parent)) 
       action(parent, child); 
     } 
    } 

&這炒鍋如果我叫下面的方法(有項目在它的階段列表)

projects.ApplyParentChild(phases, p => p.ProjectId, c => c.ProjectId, (p, c) => p.ProjectPhases.Add(c)); 

但我經常會得到一個情況,我有一個階段有項目引用。所以我把它叫做

phases.ApplyParentChild(projects, p => p.ProjectId, c => c.ProjectId, (p, c) => p.project=c); 

這個失敗。這是因爲parents.ToDictionary(id)未能獲得唯一標識符並將錯誤返回爲「已添加具有相同密鑰的項目」。

我該如何處理這個問題?我不是一個linq大師。誰能幫我嗎 ?

+0

有沒有什麼好的理由說明你(很差)重新實現Linq連接? – spender

+0

HW是一個linq連接? –

回答

1

由於Project具有一對多的關係與Phases,你必須總是使用Project作爲父。只需更改動作:

projects.ApplyParentChild(
    phases, 
    p => p.ProjectId, 
    c => c.ProjectId, 
    (p, c) => c.project = p); 
0

你可以使用LINQ重申您的問題加入:

var joinedData = parents 
       .Join(
        children, 
        parent => parent.SomeId, //id Func 
        child => child.SomeId, //parentId Func 
        (parent, child) => new{parent, child}); 
foreach(var x in joinedData) 
{ 
    action(x.parent, x.child); 
}