Search code examples
c#linqlinq-group

Group by same value and contiguous date


var myDic = new SortedDictionary<DateTime,int> () 
                { { new DateTime(0), 0 },
                  { new DateTime(1), 1 },
                  { new DateTime(2), 1 },
                  { new DateTime(3), 0 },
                  { new DateTime(4), 0 },
                  { new DateTime(5), 2 }
                };

How can group these items (with a LINQ request) like this :

group 1 : 
  startDate: 0, endDate:0, value:0
group 2 : 
  startDate: 1, endDate:2, value:1
group 3 : 
  startDate: 3, endDate:4, value:0
group 4 : 
  startDate: 5, endDate:5, value:2

group are defined by contiguous date and same values.

Is it possible with a groupby ?


Solution

  • Just use a keyGenerating function. This example presumes your dates are already ordered in the source with no gaps.

    int currentValue = 0;
    int groupCounter = 0;
    
    Func<KeyValuePair<DateTime, int>, int> keyGenerator = kvp =>
    {
      if (kvp.Value != currentValue)
      {
        groupCounter += 1;
        currentValue = kvp.Value;
      }
      return groupCounter;
    }
    
    List<IGrouping<int, KeyValuePair<DateTime, int>> groups =
      myDictionary.GroupBy(keyGenerator).ToList();