Как вытащить нужную часть данных из словаря C#

153
26 января 2020, 13:20

Совсем недавно начал программировать, столкнулся с трудностью. У меня есть словарь, внутри которого ключи - названия нужных сигналов, внутри каждого ключа есть 2 значения, время(типа DateTime) и значение сигнала в этот момент времени:

public static Dictionary<string, SortedDictionary<DateTime, double>> dic = new Dictionary<string, SortedDictionary<DateTime, double>>();

Вот такие данные лежат в словаре:

public static void readDic()
    {
        foreach (var varName in dic)
        {
            foreach (var data in varName.Value)
            {
                Console.WriteLine("{0}: Key: {1}, Value {2}", varName.Key, data.Key, data.Value);   
            }
        }            
    }

Пример вывода:

Как можно вытащить кусок данных всех ключей за указанный интервал. например нужно вывести данные за 3 минуты, указав начальные день, месяц, год, час, минуту

Answer 1

Не уверен, что понял, что вы хотите, но допустим в первом приближении так.

У нас есть следующий набор данных:

public Dictionary<string, SortedDictionary<DateTime, double>> GetSampleData()
{
    var d1 = new SortedDictionary<DateTime, double>() { {DateTime.Today.AddDays(-4), -11.3}, {DateTime.Today.AddDays(-3), 10.6}, {DateTime.Today.AddDays(-2), 1.1}, {DateTime.Today.AddDays(-1), 2.4} };
    var d2 = new SortedDictionary<DateTime, double>() { {DateTime.Today.AddDays(-3), 11.4} };
    var d3 = new SortedDictionary<DateTime, double>() { { DateTime.Today.AddDays(-2), -11.3 }, { DateTime.Today.AddDays(-3), 4.8 } };
    var d4 = new SortedDictionary<DateTime, double>() { { DateTime.Today.AddDays(0), 3.3 }, { DateTime.Today.AddDays(1), 6.2 } };
    return new Dictionary<string, SortedDictionary<DateTime, double>>()
    {
        {"test1",  d1 },
        {"test2",  d2 },
        {"test3",  d3 },
        {"test4",  d4 },
    };
}

Допустим ваш фильтр будет в таких датах:

var result = Filter(dic, DateTime.Today.AddDays(-3), DateTime.Today.AddDays(-1));

Вы хотите получить на выходе:

public Dictionary<string, SortedDictionary<DateTime, double>> Filter(Dictionary<string, SortedDictionary<DateTime, double>> source, DateTime from, DateTime to)
{
    return source.Where(x => x.Value.Any(v => v.Key >= from && v.Key <= to))
                 .ToDictionary(x => x.Key, x => x.Value);
}

Устраивает? Такой результат хотели?

Ладно, сразу ещё один вариант. Возможно так понять условие задачи:

public Dictionary<string, SortedDictionary<DateTime, double>> Filter(Dictionary<string, SortedDictionary<DateTime, double>> source, DateTime from, DateTime to)
{
    return source.Where(x => x.Value.Any(v => v.Key >= from && v.Key <= to))
                 .ToDictionary(x => x.Key, x => new SortedDictionary<DateTime, double>(x.Value.Where(v => v.Key >= from && v.Key <= to).ToDictionary(y => y.Key,  y => y.Value)));
}

READ ALSO
Ошибка NullReferenceException: Не выбираются специалисты

Ошибка NullReferenceException: Не выбираются специалисты

Прошу помочь с данной ошибкой: NullReferenceException: Object reference not set to an instance of an object

116
Найти значение в DataTable

Найти значение в DataTable

(c# winforms sv2010 net4) На форме есть Datagridview1 с разными типами колонок: Combobox, TextBox (определены заранее)После запуска формы в Datagridview1 по кнопке "Добавить...

112
Как написать скрипт обхода зданий в unity

Как написать скрипт обхода зданий в unity

Подскажите пожалуйста как лучше написать скрипт движения персонажа в 2д игре с видом сверху так чтобы персонаж обходил или останавливался...

134
Перебор многомерного jagged массива

Перебор многомерного jagged массива

Ребят, решил после js изучать С#, сразу возникли сложностиНеобходимо перебрать двухмерный массив

128