I have two list of members like this:
Before: Peter, Ken, Julia, Tom
After: Peter, Robert, Julia, Tom
As you can see, Ken is is out and Robert is in.
Here is the version having O(n) complexity, provided your sequences are both ordered:
public static IEnumerable SymmetricDifference(IEnumerable coll1, IEnumerable coll2, IComparer cmp)
{
using (IEnumerator enum1 = coll1.GetEnumerator())
using (IEnumerator enum2 = coll2.GetEnumerator())
{
bool enum1valid = enum1.MoveNext();
bool enum2valid = enum2.MoveNext();
while (enum1valid && enum2valid)
{
int cmpResult = cmp.Compare(enum1.Current, enum2.Current);
if (cmpResult < 0)
{
yield return enum1.Current;
enum1valid = enum1.MoveNext();
}
else if (cmpResult > 0)
{
yield return enum2.Current;
enum2valid = enum2.MoveNext();
}
else
{
enum1valid = enum1.MoveNext();
enum2valid = enum2.MoveNext();
}
}
while (enum1valid)
{
yield return enum1.Current;
enum1valid = enum1.MoveNext();
}
while (enum2valid)
{
yield return enum2.Current;
enum2valid = enum2.MoveNext();
}
}
}
public static IEnumerable SymmetricDifference(IEnumerable coll1, IEnumerable coll2)
{
return SymmetricDifference(coll1, coll2, Comparer.Default);
}