响应SortedDictionary中的更改

时间:2009-09-01 09:55:04

标签: c# dictionary delegates

我创建了一个继承自SortedDictionary的新类:

public partial class ListIncomeWeight : SortedDictionary<string, double> { 
    public Guid Identity { get; set; }
}

此列表与几个其他列表结合使用,其他列表将跟踪是否已使用此列表计算。为此目的,如果以前计算过,它们会使用Dictionary来存储结果。

身份背后的逻辑是,当它在某些其他计算中使用时,它将唯一地识别该列表。这样,当我重复计算时,我首先检查GUID以查看我之前是否计算过它。如果是这样,我已经知道了这个计算的结果,并且可以通过不再循环遍历此列表来节省一些时间。 (计算很复杂,我需要做很多,所以尽管每次计算都有一点点减少,但实际上是省时的。)

然而,当我创建列表,添加一些项目,计算,添加更多项目并再次计算时会发生什么?在这种情况下,我不会得到预期的结果,因为计算从未使用过新项目。所以我需要解决这个问题。

我的想法很简单:每当添加或删除项目时都要更改GUID。当然我可以覆盖添加/删除方法,但我想要更通用的东西。是否有一些代表或事件可以用来响应此列表中的更改?


一些进一步的解释...... 我有两套清单。一组列表包含有关人员收入的概述。 (工资,拨备,利息,储蓄账户的利息等)第二组清单定义了每种收入的权重因子。这是一个规则集,它告诉我工资计算为100%但仅提供75%等等。这些权重列表将在应用权重因子后添加所有内容,从而产生最终金额。

我必须处理一个人及其伴侣的收入,以及退休前后的收入。加上不依赖退休的收入。因此,我有大约6个人均收入清单。

我还有几十个重量列表。这些被大约1600种不同的产品使用,最糟糕的情况是我必须进行50万次计算。我需要减少这个数字,因此我需要进行大量优化。这只是这些优化的一部分。

一般来说,我需要将收入列表与权重列表结合起来,这些权重列表会产生几个值。其中一个用于查找,另一个用于计算每个人每年可以花费多少产品成本,另一个用于对此金额进行修正。还有一些我需要考虑的收入/权重组合,但总的来说这取决于计算本身。计算也使用利率,虽然它往往在很短的范围内,但利率变化很大。我已经通过计算不同的利率来优化那部分。但现在我想减少计算这些加权收入所需的计算次数。运气好的话,我应该能够将计算次数从50万减少到几千,甚至更少。

这就是为什么我想知道是否已添加或删除此权重列表中的值。发生这种情况时,它会变成一个不同的列表,因此它需要一个不同的GUID。我正在研究一个泛型类库,并且对如何使用它没有太多控制权,所以我需要确保其他开发人员不能以某种错误的方式使用它。这就是为什么这个功能真正有用的原因。

2 个答案:

答案 0 :(得分:1)

我认为没有任何通用方法可以在变更时获得回调。

另一方面,我迷失了你的逻辑 - 你使用GUID来识别一个独特的计算,但是你改变了这个计算(用结果改变字典)?添加新项目时,使用新GUID创建字典副本会不会更容易? (对不起,我真的不明白它是如何运作的)

答案 1 :(得分:1)

我认为你必须通过在列表更改(添加,删除,清除)时更新Guid来重写你的ListIncomeWeight类。我设置了一个标志,告诉内部列表是否发生了变化。 Identity属性根据此标志更新。为什么不为此创建一个事件:Changed

public partial class ListIncomeWeight : SortedDictionary<string, double>
{
    public delegate void ChangedHandler();
    public event ChangedHandler Changed;

    private Guid _guid;
    private bool _changed = false;

    private void RaiseChanged()
    {
        _changed = true;
        if (Changed != null) Changed();
    }

    public new void Add(string key, double value)
    {
        base.Add(key, value);
        RaiseChanged();
    }

    public new void Clear()
    {
        base.Clear();
        RaiseChanged();
    }

    public new bool Remove(string key)
    {            
        bool res = base.Remove(key);

        RaiseChanged();

        return res;
    }

    public Guid Identity
    {
        get
        {
            if (_changed)
            {
                _guid = new Guid();
                _changed = false;
            }
            return _guid;
        }
        set {
            _guid = value;
        }
    }        
}