C# 响应分类词典中的更改
我创建了一个从SortedDictionary继承的新类: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;} } 此列表与几十个其他列表组合在一起,如果其他列表已经使用此列表进行了计
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中记住此结果。添加值时添加列表的副本是可能的。不幸的是,这些值总是一个接一个地添加,因此我可能会得到一个类似副本的巨大列表。(是的,让它变得复杂的是列表中的列表…)