2015-08-29 8 views
1

У меня есть класс, который содержит месяцы свойства:C# объекта игнорировать месяцев свойства поддержания соседа отношений при выполнении расчетов

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 класс. Игнорируемые месяцы будут иметь значение равного 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"]; 

EDIT:

Чтобы сделать его более ясным:

Когда все месяцы данные приведены в Словаре, мой расчет отлично работает.

  • item.Jan = value ["Jan"];
  • item.Feb = item.Jan + value ["Feb"];
  • и так далее

Когда определенные месяцы отсутствуют Словарь, расчет должен быть такой:

  • пропавших месяцев имеют значение 0
  • первый ключ из словаря будет определить первое свойство класса Item, которое будет иметь значение = значение словаря ["ключ"].

Моя единственная проблема заключается в поддержании отношения к предыдущему элементу, в случае отсутствия мая, item.Jun = item.Apr + значение ["Jun"] и так далее.

+1

Похож на [XY-problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Eser

+0

Попробуйте следующее: Item.Jan = values.ContainsKey ("Jan ")? values ​​["Jan"]: 0; – jdweng

ответ

1

Вы можете использовать TryGetValue для извлечения значения из словаря, не зная, если ключ существует или нет

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 
+1

Именно то, что я искал! Теперь вы отмечены в моей книге на странице «Мои герои»! – user2818430

0

С, так ответ, используя 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

0

Ведите значение десятичного типа под названием PreviousValid и изначально установить его на Items["Jan"];. Теперь измените код из

item.Jun = item.Apr + value["Jun"]; 

нравится

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

сделать эту модификацию для всех «пункта. ххх» задания и ваш код должен работать нормально.

 Смежные вопросы

  • Нет связанных вопросов^_^