2013-07-02 3 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)이 고유 한 식별자를 가져 오지 못하고 "동일한 키를 가진 항목이 이미 추가되었습니다"라는 오류를 반환하기 때문입니다.

이 문제는 어떻게 처리합니까? 나는 린크 마스터가 아니다. 누구든지 나를 도울 수 있습니까?

+0

혹시 (가끔) Linq 가입을 재 구현 한 이유가 있습니까? – spender

+0

HW는 linq에 가입 했습니까? –

답변

1

Phases 많은 관계로 하나를 가지고, 당신은 항상 부모로 Project을 사용해야합니다. 그냥 액션을 변경하십시오 :

projects.ApplyParentChild(
    phases, 
    p => p.ProjectId, 
    c => c.ProjectId, 
    (p, c) => c.project = p); 
0
당신은 LINQ를 사용하여 문제를 다시 언급 할 수

가입 : Project 이후

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); 
} 
관련 문제