Search code examples
vb.netlinqsequentiallinq-group

Group a datatable by sequential values


I have a table with 2 columns clmAge and clmPrice like

Age Price
1  ,  100 
2  ,  100
3  ,  150
4  ,  150
5  ,  100
6  ,  100
7  ,  100

Prices might be the same for different ages, and I need the min and max age that are for all consecutive ages with the same price. I need to group my data so my results are like:

1-2 , 100  
3-4 , 150
5-7 , 100

Solution

  • Try this

    Imports System.Data
    Module Module1
        Sub Main()
            Dim dt As New DataTable()
            dt.Columns.Add("clmAge", GetType(Integer))
            dt.Columns.Add("clmPrice", GetType(Integer))
    
            dt.Rows.Add(New Object() {1, 100})
            dt.Rows.Add(New Object() {2, 100})
            dt.Rows.Add(New Object() {3, 150})
            dt.Rows.Add(New Object() {4, 150})
            dt.Rows.Add(New Object() {5, 100})
            dt.Rows.Add(New Object() {6, 100})
            dt.Rows.Add(New Object() {7, 100})
    
            Dim oldPrice = 0
            Dim groups As New List(Of Group)
            Dim newGroup As Group = Nothing
            For Each row As DataRow In dt.AsEnumerable()
    
                If row("clmPrice") <> oldPrice Then
                    newGroup = New Group()
                    groups.Add(newGroup)
                    newGroup.minAge = row("clmAge")
                    newGroup.price = row("clmPrice")
                End If
                newGroup.maxAge = row("clmAge")
                oldPrice = row("clmPrice")
            Next row
        End Sub
    End Module
    Public Class Group
        Public minAge As Integer
        Public maxAge As Integer
        Public price As Integer
    End Class