Сгруппировать по словарю LINQ - PullRequest
0 голосов
/ 19 марта 2019

У меня есть список, который содержит список словаря. Словарь содержит ключ «date» со значением DateTime и различные другие ключи, соответствующие значениям десятичных чисел. Я хочу сгруппировать по дате и сделать среднее значение каждого десятичного числа.

Я делал это раньше с помощью linq, но не могу понять это с помощью словаря.

List<object> list = new List<object>();
Dictionary<string,object> dictionary = new Dictionary<string,object>
dictionary.Add("date", date)
foreach( field in json )
{
    dictionary.Add(field.Key, field.Value)
}
list.Add(dictionary);
list = list.GroupBy(m => (DateTime)m["date"], m => "not sure what to do here", (k,d) => (new object[]{k, d.Average()}).ToList()).ToList();

m["date"] тоже не работает.

Словарь содержит следующие данные:

  1. «Ключевые» данные - «Значение» 29.05.2015 05:50:06
  2. «Ключ» Время обработки - «Значение» 6
  3. «Ключ» Использование диска - «Значение» 2

Если в json больше нет элементов, словарь добавляется в список, и процесс повторяется.

1 Ответ

1 голос
/ 19 марта 2019

Из вашего описания кажется, что вы используете словарь для представления видов "полей" / "свойств" и их значений, и что они связаны с каждым:

Словарь содержит ключ«date» со значением DateTime и различными другими ключами, которые соответствуют значениям десятичных чисел

В этом случае вам лучше создать собственный класс с каждым из этих ключей как отдельным свойствомкласс.Что-то вроде:

public class YourClass 
{
    public Date DateTime { get; set; }
    public int SomeProperty1 { get; set; }
    public int SomeProperty2 { get; set; }
    // ....
}

Как только вы это сделаете, вместо List<Dictionary<string,object>> получите List<YourClass>.Теперь вам будет легко выполнить требуемый linq:

Я хочу сгруппировать по дате и сделать среднее для каждого десятичного числа.

var result = listOfCustomTypes.GroupBy(i => i.DateTime)
                              .Select(g => new YourClass {
                                  Date = g.Key,
                                  SomeProperty1 = g.Average(i => i.SomeProperty1),
                                  SomeProperty2 = g.Average(i => i.SomeProperty2),
                              });

Наконец, поскольку ваши данные изначально имеют формат JSON, вы можете:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...