c# object ignore months properties 在执行计算时保持邻居关系
c# object ignore months properties maintain neighbor relation while performing calculation
我有一个 class 包含月份 属性:
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);
值字典中的小数值可以是任何小数值,为了演示目的我添加了 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
class 中的某些月份 属性。忽略的月份的值为 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"];
编辑:
为了更清楚:
当词典中提供了所有月份的数据时,我的计算工作正常。
- item.Jan = 值["Jan"];
- item.Feb = item.Jan + 值["Feb"];
- 等等
当字典中缺少某些月份时,计算应如下所示:
- 缺失月份的值为 0
- 字典中的第一个键将定义项目 class 中的第一个 属性,其值将等于字典 ["key"] 值。
我唯一的问题是保持与前一项的关系,以防 May 丢失,item.Jun = item.Apr + value["Jun"] 等等。
您可以使用 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,制作了这 2 种方法:
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" 作业进行此修改,您的代码应该可以正常工作。
我有一个 class 包含月份 属性:
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);
值字典中的小数值可以是任何小数值,为了演示目的我添加了 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
class 中的某些月份 属性。忽略的月份的值为 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"];
编辑:
为了更清楚:
当词典中提供了所有月份的数据时,我的计算工作正常。
- item.Jan = 值["Jan"];
- item.Feb = item.Jan + 值["Feb"];
- 等等
当字典中缺少某些月份时,计算应如下所示:
- 缺失月份的值为 0
- 字典中的第一个键将定义项目 class 中的第一个 属性,其值将等于字典 ["key"] 值。
我唯一的问题是保持与前一项的关系,以防 May 丢失,item.Jun = item.Apr + value["Jun"] 等等。
您可以使用 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,制作了这 2 种方法:
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" 作业进行此修改,您的代码应该可以正常工作。