0

ので、私は持っています:

Dictionary<some_enumerator, int> available_spaces;
Dictionary<some_enumerator, int> occupied_spaces;
Dictionary<some_enumerator, int> total_spaces;

特定のタイプのスペースを占有するときに、占有されているタイプXのスペースの数をマークし、Occupy(enum.space_type)を呼び出す前に、使用可能なスペースがあることを確認できます。

現在、占有スペースと利用可能スペース用のシンプルなゲッター/セッターがあります。

public Dictionary<some_enumerator, int> Occupied_Spaces { get; set; }
public Dictionary<some_enumerator, int> Available_Spaces { get; set; }
public Dictionary<some_enumerator, int> Total_Spaces { get; set; }

理想的には、Occupied_Spacesを呼び出すときはいつでも、たとえばこれを行う代わりに、各キーの使用可能なスペースを再計算したいと思います(単に合計スロットから占有スロットを差し引くことによって)。

object.Occupied_Spaces[space_type]++;
object.RecalculateSpaces();

Occupied_Spacesを変更するたびに、代わりに次のようなことをしたいと思います(これが機能しないことはわかっていますが、次のようなアイデアが得られます。

public Dictionary<some_enumerator> Occupied_Spaces {
     get { return _occupied_spaces; }
     set { _occupied_spaces = value; RecalculateSpaces(); }
}

現在、Occupied_Spaces [key] ++を呼び出しても、Occupied_Spacesのセッターは呼び出されません(デバッグ印刷をRecalculateSpacesにスローしてテストしましたが、起動しませんでした)。

しかし、辞書の+(またはその他の基本的な演算子)をオーバーライドする方法がわかりません。これを行う簡単な方法はありますか?

4

2 に答える 2

3
public Dictionary<some_enumerator> Occupied_Spaces {
    get { return _occupied_spaces; }
    set { _occupied_spaces = value; RecalculateSpaces(); }
}

現在、Occupied_Spaces [key] ++を呼び出しても、Occupied_Spacesのセッターは呼び出されません(デバッグ印刷をRecalculateSpacesにスローしてテストしましたが、起動しませんでした)。

右。設定していないからですOccupied_Spaces。あなたOccupied_Spacesはまだまったく同じ辞書オブジェクトを参照していますが、その内容だけが変更されています。

Dictionary<,>購読するイベントがないChangeため、直面している問題は解決できません。代わりにできることは、を実装するカスタムクラスを作成し、IDictionary<,>そのインターフェイスを使用することです。カスタムクラスは、ディクショナリの内容が変更されたときにイベントを発生させることができます。

于 2013-03-23T19:59:01.840 に答える
0

Available_Spaces次の関数に置き換えることで、同期の必要性を回避できます。

GetAvailableSpace(some_enumerator e)
{
    return Total_Spaces[e] - Occupied_Spaces[e];
}
于 2013-03-23T20:16:04.673 に答える