using System.Collections.Generic;
public static void printEnum<T>(IEnumerable<T> enumr) {
public static IEnumerable<Tuple<bool, T>> GetDifferences<T>(IEnumerable<T> a, IEnumerable<T> b) where T : IComparable
var enumA = a.GetEnumerator();
foreach(var r in b.Select(i => Tuple.Create(false, i)))
var enumB = b.GetEnumerator();
foreach(var r in a.Select(i => Tuple.Create(true, i)))
var currentCompare = enumA.Current.CompareTo(enumB.Current);
if (currentCompare == 0) {
while(enumB.MoveNext()) {
yield return Tuple.Create(false, enumB.Current);
yield return Tuple.Create(true, enumA.Current);
} while(enumA.MoveNext());
} else if (currentCompare < 0) {
yield return Tuple.Create(true, enumA.Current);
yield return Tuple.Create(false, enumB.Current);
} while(enumB.MoveNext());
yield return Tuple.Create(false, enumB.Current);
yield return Tuple.Create(true, enumA.Current);
} while(enumA.MoveNext());
public static void Main()
var examples = new Tuple<List<int>,List<int>>[] {
foreach(var t in examples) {
Console.WriteLine("-----");
printEnum(GetDifferences(t.Item1,t.Item2).Select(i => (i.Item1 ? "add " : "remove ") + i.Item2));
Console.WriteLine("=================");