private int InnerAddOrReplace(Type key, Delegate value, Func<Type, Delegate> valueCreator)
{
var previousIndex = -1;
var currentIndex = headIndex;
while(currentIndex != -1)
{
var current = items[currentIndex];
if(IsMatch(current.Key, key))
{
if(current.Key == key)
{
items[currentIndex] = current.With(value: value);
return currentIndex;
}
break;
}
previousIndex = currentIndex;
currentIndex = current.NextElementIndex;
}
var newItem = new SwapListItem(key, value, valueCreator, items.Count);
if(previousIndex == -1)
{
newItem.NextElementIndex = headIndex;
headIndex = newItem.Id;
}
else
{
newItem.NextElementIndex = items[previousIndex].NextElementIndex;
items[previousIndex] = items[previousIndex].With(nextElementIndex: newItem.Id);
}
items.Add(newItem);
return newItem.Id;
}