using System.Collections.Generic;
private static readonly Random _random = new Random();
public static void Main(string[] args)
var data = new List<byte>();
var lookup = new Dictionary<int, PairInfo>();
for (var i = 0; i < 30; i++)
var newPairInfo = new PairInfo();
for (var j = 0; j < 2; j++)
var randomIndex = _random.Next(0, lookup.Count);
var useA = _random.Next(0, 2) == 0;
position = useA ? lookup[randomIndex].A.Offset : lookup[randomIndex].B.Offset;
var dataToInsert = j == 0 ? a : b;
data.InsertRange(position, dataToInsert);
var entriesNeedToUpdate = lookup.Values
.SelectMany(pair => new[] { pair.A, pair.B })
.Where(entry => entry.Offset >= position);
foreach (var entry in entriesNeedToUpdate)
entry.Offset += dataToInsert.Length;
if (newPairInfo.A?.Offset >= position)
newPairInfo.A.Offset += dataToInsert.Length;
newPairInfo.A = new EntryInfo(position, dataToInsert.Length);
newPairInfo.B = new EntryInfo(position, dataToInsert.Length);
lookup.Add(i, newPairInfo);
foreach (var pair in lookup.Values)
var a = data.Skip(pair.A.Offset).Take(pair.A.Length).ToArray();
if (!a.SequenceEqual(new byte[] { 1, 2, 3 }))
throw new Exception("Something is wrong :/ - A");
var b = data.Skip(pair.B.Offset).Take(pair.B.Length).ToArray();
if (!b.SequenceEqual(new byte[]{ 9, 8, 7 }))
throw new Exception("Something is wrong :/ - B");
foreach (var entry in lookup.Values.SelectMany(pair => new[] { pair.A, pair.B }).OrderBy(entry => entry.Offset))
var array = data.Skip(entry.Offset).Take(entry.Length).ToArray();
private static byte[] GenerateA()
return new byte[] { 1, 2, 3 };
private static byte[] GenerateB()
return new byte[] { 9, 8, 7 };
private static void PrintArray(byte[] array)
for(var i=0; i<array.Length; i++)
if(i < (array.Length -1))
public int Offset { get; set; }
public int Length { get; set; }
public EntryInfo(int offset, int length)
public EntryInfo A { get; set; }
public EntryInfo B { get; set; }