c#对象忽略月份属性,在执行计算时保持邻居关系

本文关键字:计算 执行 关系 邻居 对象 属性 | 更新日期: 2023-09-27 18:10:33

我有一个包含months属性的类:

public class Item
{
   public Item()
   {
   }
   public decimal Jan { get; set; }
   public decimal Feb { get; set; }
   public decimal Mar { get; set; }
   public decimal Apr { get; set; }
   public decimal May { get; set; }
   public decimal Jun { get; set; }
   public decimal Jul { get; set; }
   public decimal Aug { get; set; }
   public decimal Sep { get; set; }
   public decimal Oct { get; set; }
   public decimal Nov { get; set; }
   public decimal Dec { get; set; }
}

还有一个Dictionary<string, decimal>

Dictionary<string, decimal> values = new Dictionary<string, decimal>();
values.add("Jan", 10.00);
values.add("Feb", 10.00);
values.add("Mar", 10.00);
values.add("Apr", 10.00);
values.add("May", 10.00);
values.add("Jun", 10.00);
values.add("Jul", 10.00);
values.add("Aug", 10.00);
values.add("Sep", 10.00);
values.add("Oct", 10.00);
values.add("Nov", 10.00);
values.add("Dec", 10.00);

values字典中的十进制值可以是任何十进制值,为了演示,我添加了10.00。

我需要按以下方式计算这些值:

Item.Jan = values["Jan"];
Item.Feb = Item.Jan + values["Feb"];
Item.Mar = Item.Feb + values["Mar"];
Item.Apr = Item.Mar + values["Apr"];
Item.May = Item.Apr + values["May"];
Item.Jun = Item.May + values["Jun"];
Item.Jul = Item.Jun + values["Jul"];
Item.Aug = Item.Jul + values["Aug"];
Item.Sep = Item.Aug + values["Sep"];
Item.Oct = Item.Sep + values["Oct"];
Item.Nov = Item.Oct + values["Nov"];
Item.Dec = Item.Nov + values["Dec"];

到目前为止一切顺利。

问题是:我需要忽略Item类中的某些月份属性。忽略的月份的值为0。

如果字典中包含以下值:

Dictionary<string, decimal> values = new Dictionary<string, decimal>();
values.add("Feb", 10.00);
values.add("Mar", 10.00);
values.add("Apr", 10.00);
values.add("Jun", 10.00);
values.add("Jul", 10.00);
values.add("Aug", 10.00);
values.add("Oct", 10.00);
values.add("Nov", 10.00);
values.add("Dec", 10.00);

注意Jan, May, Sep缺失,我该如何执行我的计算,与字典中提供的值,并保持上月计算中的关系?字典中的第一个月被认为是第一个月。Item的第一个月总是只等于字典中的值。

在这种情况下的计算将是:

Item.Jan = 0.00;
Item.Feb = values["Feb"];   // Jan is missing from dictionary first month is Feb
Item.Mar = Item.Feb + values["Mar"];
Item.Apr = Item.Mar + values["Apr"];
Item.May = 0.00;
Item.Jun = Item.Apr + values["Jun"]; // May is missing, Jun = previous available month (Apr) + dictionary value of Jun
Item.Jul = Item.Jun + values["Jul"];
Item.Aug = Item.Jul + values["Aug"];
Item.Sep = 0.00;
Item.Oct = Item.Aug + values["Oct"]; // Sep is missing, Oct = previous available month (Aug) + dictionary value of Aug
Item.Nov = Item.Oct + values["Nov"];
Item.Dec = Item.Nov + values["Dec"];
编辑:

更清楚:

当字典中提供了所有月份数据时,我的计算工作正常。

  • 项目。Jan = value["Jan"];
  • 项目。Feb = item。Jan + value["Feb"];
  • 等等

当字典中缺少某些月份时,计算应该如下所示:

  • 缺失月份值为0
  • 字典中的第一个键将定义Item类中的第一个属性,它的value =字典["key"]的值。
我唯一的问题是保持与前一个项目的关系,以防May丢失,项目。Jun = item。Apr + value["Jun"]等等

c#对象忽略月份属性,在执行计算时保持邻居关系

您可以使用TryGetValue从Dictionary中提取值,而无需知道Key是否存在

decimal temp;
decimal runningTotal = 0m;
// Jan doesn't exist, so temp will default to zero
values.TryGetValue("Jan", out temp);
runningTotal += temp;
item.Jan = (temp == 0m ? temp : runningTotal);
values.TryGetValue("Feb", out temp);
runningTotal += temp;
item.Feb = (temp == 0m ? temp : runningTotal);
values.TryGetValue("Mar", out temp);
runningTotal += temp;
item.Mar = (temp == 0m ? temp : runningTotal);
values.TryGetValue("Apr", out temp);
runningTotal += temp;
item.Apr = (temp == 0m ? temp : runningTotal);
// May doesn't exist, so temp will default to zero
// and Item.May get a zero for its value 
// runningTotal is still set to the value of Apr
values.TryGetValue("May", out temp);
runningTotal += temp;
item.May = (temp == 0m ? temp : runningTotal);
// Resume the sums with the value of Jun
values.TryGetValue("Jun", out temp);
runningTotal += temp;
item.Jun = (temp == 0m ? temp : runningTotal);
... and so on for the other months

有一个类似的答案,使用TryGetValue,我们已经做了这两个方法:

    public decimal GetValuesFromDictionary(Dictionary<string, decimal> values)
    {
        Jan = GetValueFromKey(values, "Jan");
        Feb = Jan + GetValueFromKey(values, "Feb");  
        Mar = Feb + GetValueFromKey(values, "Mar");
        Apr = Mar + GetValueFromKey(values, "Apr");
        May = Apr + GetValueFromKey(values, "May");
        Jun = Apr + GetValueFromKey(values, "Jun"); 
        Jul = Jun + GetValueFromKey(values, "Jul");
        Aug = Jul + GetValueFromKey(values, "Aug");
        Sep = Aug + GetValueFromKey(values, "Sep");
        Oct = Sep + GetValueFromKey(values, "Oct"); 
        Nov = Oct + GetValueFromKey(values, "Nov");
        Dec = Nov + GetValueFromKey(values, "Dec");
        return Dec;
    }
    private decimal GetValueFromKey(Dictionary<string,decimal> values, string key)
    {
        decimal temp;
        values.TryGetValue(key, out temp);
        return temp;
    }

用值测试你的情况,是正确的吗?

Dictionary<string, decimal> values = new Dictionary<string, decimal>();
            values.Add("Feb", 10);
            values.Add("Mar", 10);
            values.Add("Apr", 10);
            values.Add("Jun", 10);
            values.Add("Jul", 10);
            values.Add("Aug", 10);
            values.Add("Sep", 10);
            values.Add("Oct", 10);
            values.Add("Nov", 10);
            values.Add("Dec", 10);
            Decimal total = 0;
            Item Item = new Item();
        total = Item.GetValuesFromDictionary(values);

返回给我正确的值=D

保留名为PreviousValid的十进制类型值,并初始设置为Items["Jan"];。现在从

更改代码
item.Jun = item.Apr + value["Jun"];

PreviousValid = (item.Apr != null) ? item.Apr : PreviousValid;
item.Jun = PreviousValid + value["Jun"];

对所有"item"进行修改。xxx"赋值和你的代码应该工作得很好。