using System.Collections.Generic;
namespace ConsoleApplication1
public string ParentName { get; set; }
public IEnumerable<string> ChildNames { get; set; }
public string ParentName { get; set; }
public string ChildName { get; set; }
public static void Main(string[] args)
var parents = new List<Parent>()
new Parent() {ParentName = "Lee"},
new Parent() {ParentName = "Bob"},
new Parent() {ParentName = "Tom"}
var children = new List<Child>()
new Child() {ParentName = "Lee", ChildName = "A"},
new Child() {ParentName = "Tom", ChildName = "B"},
new Child() {ParentName = "Tom", ChildName = "C"}
foreach (var parent in parents)
p.ChildNames = children.Where(c => c.ParentName == p.ParentName).Select(c => c.ChildName);
Display("Technique #1:", parents);
join c in children on p.ParentName equals c.ParentName into childList
select new { Parent = p, ChildrenNames = childList.Select(c => c.ChildName) };
foreach (var dzp in parentChildPairs)
var c = dzp.ChildrenNames;
Display("Technique #2:", parentChildPairs.Select(p => p.Parent));
parents.ForEach(p => p.ChildNames = children.Where(c => c.ParentName == p.ParentName).Select(c => c.ChildName).ToList());
Display("Technique #3:", parents);
var clu = children.ToLookup(c => c.ParentName, c => c.ChildName);
parents.ForEach(p => p.ChildNames = clu[p.ParentName]);
Display("Technique #4:", parents);
static void Display(string message, IEnumerable<Parent> parents)
Console.WriteLine(message);
foreach (var p in parents)
var childNames = string.Join(",", p.ChildNames);
Console.WriteLine("Parent = {0}, Children = {1}", p.ParentName, childNames);