public static void ApplyStates <StateType>( List <StateType> oldStates, List <StateType> newStates, Func <StateType, StateType, bool> doStatesHaveSameId, Action <StateType> removeStateObject, Action <StateType> addStateObject, Action <StateType, StateType> updateStateObject ) { List <StateType> removedStates, addedStates, updatedStates; ListExtensions.GetChanges( oldStates, newStates, doStatesHaveSameId, out removedStates, out addedStates, out updatedStates ); // Despawn weapon objects. foreach (var removedState in removedStates) { removeStateObject(removedState); } // Spawn weapon objects. foreach (var addedState in addedStates) { addStateObject(addedState); } // Update existing weapon objects. foreach (var updatedState in updatedStates) { var oldState = oldStates.First(os => doStatesHaveSameId(os, updatedState)); updateStateObject(oldState, updatedState); } }