Я искал вокруг, и до сих пор не удалось найти хороший способ сделать это. Я уверен, что это общая проблема.
Предположим, у меня есть следующее:
class SomeClass : IComparable
{
private int myVal;
public int MyVal
{
get { return myVal; }
set { myVal = value; }
}
public int CompareTo(object other) { /* implementation here */ }
}
class SortedCollection<T>
{
private T[] data;
public T Top { get { return data[0]; } }
/* rest of implementation here */
}
Идея состоит в том, что я собираюсь реализовать двоичную кучу, и вместо того, чтобы поддерживать только операции Insert () и DeleteMin (), я хочу поддерживать "просмотр" на самом высоком (или наименьшем, в зависимости от обстоятельств) ) значение приоритета в стеке. Никогда не любил Гейзенберга, и весь этот принцип неопределенности «нельзя смотреть на вещи, не меняя их». Мусор!
Проблема, очевидно, заключается в том, что вышеприведенное не предоставляет средств для предотвращения изменения вызывающим кодом MyVal (при условии SortedCollection) через свойство Top, и эта операция имеет явную возможность поместить мою кучу в неправильный порядок. Есть ли способ предотвратить применение модификаций к внутренним элементам кучи через свойство Top? Или я просто использую код с предупреждением: «Стабильно, только если вы не изменяете какие-либо экземпляры между временем их вставки и dequeue'd. YMMV.»