Возникли проблемы при выражении группового запроса в LINQ - PullRequest
3 голосов
/ 16 сентября 2011

У меня есть 2 типа:

public class TimedValue
{
    public DateTime TimeStamp { get; set; }
    public double Value { get; set; }
}

public class Stats
{
    IList<TimedValue> Values { get; set; }
    ... // some other fields
}

Несколько экземпляров Stats хранятся в объекте коллекции IEnumerable.Я пытаюсь найти запрос LINQ, который бы дал мне хронологическую сумму значений по всем экземплярам статистики.Это означает, что он будет проходить через каждое TimedValue в каждом объекте Stats, и, если их TimeStamps совпадают, он добавит поля Value.Так что в конце я получу хронологически (от старейшего до новейшего) сгруппированный список двойников.

Будучи слабым в LINQ, я терплю неудачу в этом.Я только дошел до того, чтобы сделать:

.Select(stat => stat.Values)

Для проецирования до:

List<List<Value>>

Какой поднабор объекта Stats мне нужен, но я не могу понять,как сгруппировать итоговые значения, которые мне нужны из этого.

Пример (поскольку существует некоторая путаница относительно того, что я имел в виду):

Предположим, у нас есть 2 экземпляра статистики, я упрощаю нотациюздесь, просто для краткости примеров:

Stats1 : Значения = {{"Monday", 1.1}, {"Tuesday", 2.2}}
Stats2 : Значения = {{"Понедельник", 1.1}, {"Вторник", 2.2}, {"Пятница", 3.3}}

Результатом должен быть список двойников: {2.2, 4.4, 3.3}

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Это должно дать вам список парных чисел, содержащих суммы:

statList.SelectMany(stat => stat.Values)
        .GroupBy( x => x.TimeStamp)
        .OrderBy( g => g.Key)
        .Select( g => g.Sum(x => x.Value));
        .ToList();

Если вы не хотите сумм (не совсем понятно в вопросе), это даст вам только список группировок:

var timeStampGroups = statList.SelectMany(stat => stat.Values)
                              .GroupBy( x => x.TimeStamp)
                              .OrderBy( g => g.Key)
                              .ToList();
0 голосов
/ 16 сентября 2011

Обновлен для возврата списка двойников в соответствии с запросом.

Это должно помочь:

var values = (from stat in statsCollection
              from value in stat.Values
              //group the values by the timestamp
              group value by value.TimeStamp into grouping
              orderby grouping.Key
              select grouping.Sum(v => v.Value)).ToList();

Вот вывод:

output

...