using System.Collections.Generic;
public int Index { get; set; }
public bool State { get; set; }
public static void Main()
List<A> list1 = new List<A>() {
new A(){ Index = 1, State = false },
new A(){ Index = 2, State = false },
new A(){ Index = 3, State = true },
new A(){ Index = 4, State = false },
new A(){ Index = 5, State = false },
List<A> list2 = new List<A>() {
new A(){ Index = 1, State = false },
new A(){ Index = 2, State = true },
new A(){ Index = 3, State = false },
new A(){ Index = 4, State = false },
new A(){ Index = 5, State = false },
new A(){ Index = 6, State = true },
new A(){ Index = 7, State = false },
var left = (from l1 in list1
join l2 in list2 on l1.Index equals l2.Index into j
from l2 in j.DefaultIfEmpty()
State = l1.State & (l2 == null ? true : l2.State)
var right = (from l2 in list2
join l1 in list1 on l2.Index equals l1.Index into k
from l1 in k.DefaultIfEmpty()
State = l2.State & (l1 == null ? true : l1.State)
List<A> result = left.Union(right).ToList();
Console.WriteLine("{0} {1}", item.Index, item.State);
foreach (A item in right)
Console.WriteLine("{0} {1}", item.Index, item.State);
foreach (A item in right)
Console.WriteLine("{0} {1}", item.Index, item.State);