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 ? false : 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 ? false : l1.State)
Dictionary<int, A> dict = left.Union(right).GroupBy(x => x.Index).Select(x => x.First())
.ToDictionary(x => x.Index, y => y);
Console.WriteLine("{0} {1}", item.Index, item.State);
foreach (A item in right)
Console.WriteLine("{0} {1}", item.Index, item.State);
foreach (int key in dict.Keys)
Console.WriteLine("{0} {1}", key, dict[key].State);