2015-01-02 3 views
0

Я знаю, что нет в C# нет reference to "struct" variable, но это тот случай, когда он придет удобныйПредотвращение двойного поиска одного и того же элемента в словаре

как можно выполнить 2 операции (увеличение в данном случае) на том же элементе без использования operator[] дважды (чтобы избежать двойного поиска)?

+0

Весь смысл хэшированной структуры данных (словари, хэшеты и т. Д.) Заключается в том, что поиск дешев. –

+5

Вы на самом деле выполняете * четыре поиска в этом случае - получите, затем установите, а затем установите, затем установите. Но есть ли у вас причины думать, что это действительно проблема в вашем реальном приложении? –

+0

Легкий ответ: вы фиксируете первый результат. Трудный ответ: Сделайте некоторые исследования. – leppie

ответ

3

Вы можете создать изменяемый ссылочный тип, который оборачивает другое значение, в данном случае неизменяемого типа значения, что позволяет значение обертки мутировать:

public class Wrapper<T> 
{ 
    public T Value { get; set; } 
} 

Это позволяет написать:

Dictionary<int, Wrapper<int>> d = new Dictionary<int, Wrapper<int>>(); 

d.Add(1, new Wrapper<int>(){Value = 1}); 

var wrapper = d[1]; 
wrapper.Value++; 
wrapper.Value++; 
+0

так ответ: «невозможно избежать поиска по неизменяемым типам»? – relaxxx

+0

@relaxxx Невозможно сделать несколько изменений для значения словаря, где значения неизменяемы без выполнения нескольких поисков, да. Вы не можете получить ссылку на ведро для значения этого словаря и продолжить настройку без выполнения поиска. Вы могли бы написать свою собственную реализацию «Словарь», которая, конечно же, открывала эту функциональность. – Servy

+0

ОК, спасибо. Я исхожу из C++ и его итераторов и указателей и т. Д., Где такие вещи возможны. – relaxxx

Смежные вопросы