Настройка .Net и получение свойства словаря - PullRequest
0 голосов
/ 05 октября 2018

Ниже приведен простой класс, который позволяет устанавливать HighTemps и LowTemps.Существует также свойство только для чтения TempRange, которое использует цикл для вычисления в getter.Есть ли более элегантный способ сделать это, кроме цикла?Учитывая, что TempRange всегда будет производным от HighTemps и LowTemps и что у всех трех будет в основном 7 элементов с индексом, есть ли лучший способ сделать это без цикла для установки значения TempRange?

using System;
using System.Collections.Generic;

public class Program
{
    public class Weather{
      public Weather(Dictionary<int,int> highTemps,Dictionary<int,int> lowTemps,Dictionary<int,int> tempRange){
        HighTemps = highTemps;
        LowTemps = lowTemps;
      }
      public Dictionary<int,int> HighTemps {get;set;}
      public Dictionary<int,int> LowTemps {get;set;}
      public Dictionary<int,int> TempRange{
        get{
            Dictionary<int,int> result = new Dictionary<int,int>();
            foreach (KeyValuePair<int, int> pair in HighTemps)
            {
                result.Add(pair.Key,pair.Value - LowTemps[pair.Key]);
            }           
            return result;
        }
      }     
    }
    public static void Main(){      
        Weather temps = new Weather(new Dictionary<int,int>(),new Dictionary<int,int>(),new Dictionary<int,int>());
        //add day of week and temp
        temps.HighTemps.Add(1, 84);
        temps.HighTemps.Add(2, 86);
        temps.HighTemps.Add(3, 81);
        temps.HighTemps.Add(4, 82);
        temps.HighTemps.Add(5, 82);
        temps.HighTemps.Add(6, 83);
        temps.HighTemps.Add(7, 84);

        temps.LowTemps.Add(1, 65);
        temps.LowTemps.Add(2, 66);
        temps.LowTemps.Add(3, 71);
        temps.LowTemps.Add(4, 60);
        temps.LowTemps.Add(5, 64);
        temps.LowTemps.Add(6, 69);
        temps.LowTemps.Add(7, 70);      


        foreach (KeyValuePair<int, int> pair in temps.TempRange)
        {
            Console.WriteLine("The range for Day {0} of the week was {1}", pair.Key, pair.Value);
        }
    }
}

//Output:
The range for Day 1 of the week was 19
The range for Day 2 of the week was 20
The range for Day 3 of the week was 10
The range for Day 4 of the week was 22
The range for Day 5 of the week was 18
The range for Day 6 of the week was 14
The range for Day 7 of the week was 14

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Вы не можете избежать возникновения цикла, но вы можете избежать его кодирования, изучив некоторые Linq:

public Dictionary<int,int> TempRange 
{ 
  get { 
      return LowTemps.ToDictionary(l => l.Key, l => HighTemps[l.Key] - l.Value); 
      }
}

, но я согласен со всеми пунктами @ Zyo.

0 голосов
/ 05 октября 2018

Что если вы используете toDictionary от Linq?https://www.dotnetperls.com/todictionary

public Dictionary<int, int> TempRange
{
    get 
    {
        return HighTemps.ToDictionary(k => k.Key, v => v.Value - LowTemps[v.Key]);
    }
}
0 голосов
/ 05 октября 2018

Вот возможное решение вашей проблемы.Создайте и работайте с Объектом, который представляет день недели и пики погоды (высокие и низкие температуры) для этой конкретной даты.Дополнительно мы добавляем диапазон свойств, который вычисляет разницу.Создайте список и добавьте в него все дни.После этого просто повторяйте каждый день и возвращайте диапазон.Смотрите мой пример кода ниже.Откройте VS, создайте новое консольное приложение и вставьте пример.

public class Program
{
    public static void Main()
    {
        List<WeatherDay> weatherDays = new List<WeatherDay>();

        //add day of week and temp
        weatherDays.Add(new WeatherDay(1, 84, 65));
        weatherDays.Add(new WeatherDay(2, 86, 66));
        weatherDays.Add(new WeatherDay(3, 81, 71));
        weatherDays.Add(new WeatherDay(4, 82, 60));
        weatherDays.Add(new WeatherDay(5, 82, 64));
        weatherDays.Add(new WeatherDay(6, 83, 69));
        weatherDays.Add(new WeatherDay(7, 84, 70));

        weatherDays.ForEach(wetherDay => {
            Console.WriteLine("The range for Day {0} of the week was {1}", wetherDay.Day, wetherDay.Range);
        });

        Console.ReadLine();
    }
}

public class WeatherDay
{
    public int Day { get; set; }
    public int HighTemp { get; set; }
    public int LowTemp { get; set; }

    public WeatherDay(int day, int highTemp, int lowTemp)
    {
        this.Day = day;
        this.HighTemp = highTemp;
        this.LowTemp = lowTemp;
    }
    public int Range { get { return HighTemp - LowTemp; } }
}

Надеюсь, это поможет вам в дальнейшем!Ура! * * 1004

0 голосов
/ 05 октября 2018

Я не думаю, что есть лучший способ сделать это, чем цикл.

Маленькие вещи:

  • Конструктор принимает 3 параметра, третий бесполезен,удалите его.
  • Я думаю, что все ваши данные могут быть сохранены в простом списке WeatherDay.Что-то вроде:
public class WeatherDay {
    public int Min;
    public int Max;
    public int Range => Max - Min;
}
...