Frage

I have a method which will map the child collections to appropriate parents in the parent collection

 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);
        }
    }

&This woks if I call the method as below ( project having list of phases in it)

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

But I often get a situation where i have a phase having project reference in it . so that time I call it as

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

this fails . this is because parents.ToDictionary(id) fails to get unique identifiers and returns the error as "An item with the same key has already been added."

How do I handle this problem ? I am not a linq master . Can anyone help me out ?

War es hilfreich?

Lösung

Since Project has a one to many relationship with Phases, you have to always use Project as the parent. Just change the action:

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

Andere Tipps

You could restate your problem using a linq join:

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top