public void Update()
{
//remove
var toRemove = ActiveResources.Where(resource => !IsAccepted(resource)).ToList();
foreach (var resource in toRemove)
{
RemoveResource(resource);
}
//insert
var toInsert = _registeredResources.Exclude(toRemove.Union(ActiveResources));
foreach (var clientResource in toInsert.Where(IsAccepted))
{
AddResource(clientResource);
}
//reorder
var clientResources = OrderedResources(ActiveResources).ToList();
foreach (var target in clientResources)
{
var actualPosition = ActiveResources.IndexOf(target);
var expectedPosition = clientResources.IndexOf(target);
if (actualPosition != expectedPosition)
{
ActiveResources.Move(actualPosition, expectedPosition);
}
}
}