0

所以我有:

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

这个想法是,当我占用给定类型的空间时,我可以标记 X 类型的空间被占用了多少,并在调用 Occupy(enum.space_type) 之前检查以确保有可用空间。

目前,我对 Occupied 和 Available 空间有简单的 getter/setter:

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 回答