using System.Collections.Generic;
using System.Text.RegularExpressions;
public string Type {get; set;}
public List<ComponentDetails> Details {get; set;}
public class ComponentDetails
public string Filename {get; set;}
public string Size {get; set;}
public DateTime Date {get; set;}
public static void Main()
var source = new List<Component>()
var destination = new List<Component>()
Details = new List<ComponentDetails>()
new ComponentDetails() { Filename = "foo.txt" }
Details = new List<ComponentDetails>()
new ComponentDetails() { Filename = "bar.txt" }
Details = new List<ComponentDetails>()
new ComponentDetails() { Filename = "la.txt" }
var matched = from s in source
join d in destination on s.Type equals d.Type into tmp
from t in tmp.DefaultIfEmpty()
System.Console.WriteLine(matched.Count());
foreach (var i in matched) {
System.Console.WriteLine(i.s.Type);
System.Console.WriteLine(i.d != null ? i.d.Details[0].Filename : string.Empty);