Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 响应分类词典中的更改_C#_Dictionary_Delegates - Fatal编程技术网

C# 响应分类词典中的更改

C# 响应分类词典中的更改,c#,dictionary,delegates,C#,Dictionary,Delegates,我创建了一个从SortedDictionary继承的新类: public partial class ListIncomeWeight : SortedDictionary<string, double> { public Guid Identity { get; set; } } 公共部分类ListIncomeWeight:SortedDictionary{ 公共Guid标识{get;set;} } 此列表与几十个其他列表组合在一起,如果其他列表已经使用此列表进行了计

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

public partial class ListIncomeWeight : SortedDictionary<string, double> { 
    public Guid Identity { get; set; }
}
公共部分类ListIncomeWeight:SortedDictionary{
公共Guid标识{get;set;}
}
此列表与几十个其他列表组合在一起,如果其他列表已经使用此列表进行了计算,则其他列表将跟踪这些列表。为此,他们使用字典来存储以前计算过的结果

标识背后的逻辑是,当它用于其他计算时,它将唯一地标识列表。这样,当我重复计算时,我会首先检查GUID,看看我以前是否计算过它。如果是这样的话,我已经知道这个计算的结果,不必再次循环这个列表,可以节省一些时间。(计算很复杂,我需要做很多计算,因此,即使每次计算只减少了一点,但它还是节省了大量的时间。)

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

我的想法很简单:在添加或删除项时更改GUID。当然,我可以重写Add/Remove方法,但我需要更通用的方法。是否有一些代表或事件可用于响应此列表中的更改?
一些进一步的解释。。。 我有两套清单。一组列表包含一个人收入的概述。(工资、准备金、利息、储蓄账户利息等)第二组列表定义了每种收入的权重系数。这是一个规则集,它告诉我工资计算为100%,但准备金仅为75%,等等。这些权重列表将在应用权重因子后添加所有内容,从而得出最终金额

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

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

一般来说,我需要将收入列表与权重列表相结合,从而得出两个值。其中一个用于查找,另一个用于计算一个人每年可以在产品成本上花费多少,还有一个是对该金额的修正。还有一些收入/体重组合,我需要考虑到等式中,但通常这取决于计算本身。计算中还使用了一个利率,这个利率变化很大,尽管它往往在一个较短的范围内。我已经通过计算不同的利率优化了这一部分。但现在我想减少计算这些加权收入所需的计算次数。如果幸运的话,我应该能够将计算数量从50万减少到几千,甚至更少


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

我不认为有任何通用的方法可以获得更改回调


另一方面,我对您的逻辑感到迷茫-您使用GUID来标识一个唯一的计算,但随后您更改了该计算(使用结果更改字典)?添加新项时,使用新GUID创建字典副本不是更容易吗?(抱歉,我真的不明白它是如何工作的)

我认为您必须通过在列表更改(添加、删除、清除)时更新Guid来重写一点您的
ListIncomeWeight
类。我设置了一个标志,告知内部列表是否已更改。标识属性将基于此标志更新。为什么不为此创建一个事件:
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;
        }
    }        
}
公共部分类ListIncomeWeight:SortedDictionary
{
公共委托void ChangedHandler();
公共事件变更处理程序变更;
私有Guid _Guid;
私有bool_changed=false;
私有无效提升更改()
{
_更改=正确;
如果(已更改!=null)已更改();
}
public new void Add(字符串键,双值)
{
添加(键、值);
提升改变();
}
公共新空白清除()
{
base.Clear();
提升改变();
}
公共新布尔删除(字符串键)
{            
bool res=基础。移除(键);
提升改变();
返回res;
}
公共Guid标识
{
得到
{
如果(_更改)
{
_guid=新guid();
_更改=错误;
}
返回guid;
}
设置{
_guid=值;
}
}        
}

在Q中添加了更多的文本。但基本上,我有两组列表,我需要将集合A中的任何列表与集合B中的任何列表组合起来,并在列表B中记住此结果。添加值时添加列表的副本是可能的。不幸的是,这些值总是一个接一个地添加,因此我可能会得到一个类似副本的巨大列表。(是的,让它变得复杂的是列表中的列表…)