2013-07-02 49 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); 
}