This is uncompiled, untested, and at least partially psuedo code.
Given that a single motion detection is enough. Elements can only move forward, moving backward will result from moving or removing another item.
eg. State 1 IEnumerable: A * B * C * D * E
State 2 IEnumerable: A * D * B * C * D1
The result for both B and for moving forward.
enum1pos = -1;
enum2pos = 0;
Value2 = enum2.Next()
enum2pos++;
List<int> SkipList = new SkipList();
while(enum1 has values left)
{
Value1 = enum1.Next()
enum1pos++;
//Skip over moved items.
while (SkipList.Count > 0 && SkipList[0] == enum2.Position)
{
Value2 = enum2.Next()
enum2pos++;
}
if (Value1 == Value2)
Value2 = enum2.Next()
enum2pos++;
continue;
int temp = enum2pos;
while(Value1 !=Value and enum2 has more values)
{
Value2 = enum2.Next();
enum2pos++;
}
if(Value1 != Value2)
ItemDeleted(Value1);
else
{
ItemMoved(Value1, enum2pos);
SkipList.Add(enum2pos);
}
//This is expensive for IEnumerable!
enum2.First();
loop temp times
enum2.Next();
//if
}
while (enum2 has values left)
{
while (SkipList.Count > 0 && SkipList[0] == enum2.Position)
{
Value2 = enum2.Next()
enum2pos++;
}
if (enum2 has values left)
Added(Value2, enum2pos)
}
:
A A
B D
B
B → 2
2
Reset Enum2
C D
C
C → 3
3
Reset Enum2
D D
(2)
(3)
E D1
E
(E)
Enum1
(D1,4)
, - , enum2pos , , , enum1, , enum2 reset all .