LINQ сравнивает значения за тот же год, другой месяц и делает подсчет, если значение изменилось - PullRequest
0 голосов
/ 22 января 2020

У меня есть набор данных, который выглядит следующим образом:

Option | Year | Month | Value 
-------+------+-------+------
   1   | 2011 |   12  |   0
-------+------+-------+------
   1   | 2011 |   11  |   1
-------+------+-------+------
   2   | 2012 |    6  |   0
-------+------+-------+------
   2   | 2012 |    7  |   0
-------+------+-------+------
   1   | 2011 |    6  |   2

Ниже показан набор результатов, который я ищу:

Option | Year | ChangedCount
-------+------+-------------
   1   | 2011 |      3
-------+------+-------------
   2   | 2012 |      0
-------+------+-------------

Измененный счет представляет, если значение изменилось в том же году между разными месяцами. скажем, если значение 06 месяцев было 2, а затем 07 изменилось на 1, то измененное количество будет равно 1. Если значение в течение двух месяцев остается неизменным, то значение changeCount равно 0

Вот что я написал до сих пор

var changes = from ord in resultSet
    group ord by new
    {
        ord.Year,
        ord.Month,
        ord.Option,
        ord.Value,
    }
    into g
    select new
    {        
        Year = g.Key.Year,
        changed = g.Count(x => x.Value == 0) 
            + g.Count(x => x.Value == 1) 
            + g.Count(x => x.Value == 2)     
    };

Как выполнить сравнение для предыдущего значения в столбце?

{0,1,2} Карта значений ENUM

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вот что я понимаю из вашего объяснения:

class Record
        {
            public int Option { get; set; }
            public int Year { get; set; }
            public int Month { get; set; }
            public int Value { get; set; }
        }


var resultSet = new List<Record> {
                new Record { Option=1, Year=2011, Month=12, Value=0   },
                new Record { Option=1, Year=2011, Month=11, Value=1  },
                new Record { Option=2, Year=2012, Month=6, Value=0   },
                new Record { Option=2, Year=2012, Month=7, Value=0   },
                new Record { Option=1, Year=2011, Month=6, Value=2   },
            };

Вспомогательный метод для подсчета изменений:

    public static int changeCount(List<Record> Records)
    {
        int previous = Records[0].Value;
        var result_change = 0;
        //i used sorted records by month you can do not this if order is not sensitive
        foreach (var rec in Records.OrderBy(x=>x.Month))
        {
            if (rec.Value != previous)
            {
                result_change++;
            }
            previous = rec.Value;
        }
        return result_change;
    }

и действительный код:

      var changes = resultSet.GroupBy(x => new { x.Year }).Select(g => new
        {
            Year = g.Key.Year,
            changed =changeCount( g.ToList()),
            Option = g.First().Option
        }).ToList();

Результат:

 2011,3,1
 2012,0,2
0 голосов
/ 22 января 2020

Попробуйте:

var changes = from ord in resultSet
                       group ord by new
                       {
                          ord.Option,
                          ord.Year,
                       }
                       into g
                       select new
                       {
                          Option = g.Key.Option,
                          Year = g.Key.Year,
                          ChangedCount = g.Select(x => x.Value).Sum()
                       };

ИЛИ

resultSet
  .GroupBy(x => new { x.Option, x.Year })
  .Select(x => new { x.Key.Option, x.Key.Year, ChangedCount = x.Select(x => x.Value).Sum() });
...