Добавить все значения в SortedMap (Java)

Более эффективным способом, на мой взгляд, является наличие другого списка, в котором вы заявляете, что вы помещаете все, что нужно «удалить». Затем, после завершения основного цикла (без .ToList ()), вы делаете еще один цикл над списком «для удаления», удаляя каждую запись, когда это происходит. Итак, в своем классе вы добавляете:

private List<Guid> toBeRemoved = new List<Guid>();

Затем вы меняете его на:

public void NotifySubscribers(DataRecord sr)
{
    toBeRemoved.Clear();

    ...your unchanged code skipped...

   foreach ( Guid clientId in toBeRemoved )
   {
        try
        {
            subscribers.Remove(clientId);
        }
        catch(Exception e)
        {
            System.Diagnostics.Debug.WriteLine("Unsubscribe Error " + 
                e.Message);
        }
   }
}

...your unchanged code skipped...

public void UnsubscribeEvent(Guid clientId)
{
    toBeRemoved.Add( clientId );
}

Это не только решит вашу проблему, это не позволит вам продолжать создавать список из вашего словаря, который стоит дорого, если там много подписчиков. Предполагая, что список абонентов, которые будут удалены на любой заданной итерации, будет меньше, чем общее число в списке, это должно быть быстрее. Но, конечно, не стесняйтесь профилировать его, чтобы быть уверенным, что это так, если есть какие-либо сомнения в вашей конкретной ситуации использования.

0
задан Tunc Jamgocyan 25 February 2015 в 23:10
поделиться