Etienne
Etienne

Reputation: 189

Min and max from list collection

How can I get the min value ad max value from this example

Public Class RowsFound
    Property RowIndex As integer
    Property Qty As Integer
    Property LineValue As Double
End Class
Dim Test as new List(Of RowsFound)

above you can see the structure to my list. This is what the data would look like. enter image description here

What would be the best way to get the RowIndex based on max LineValue and RowIndex of Min LineValue

I have done this as a test but would like to see if there a better way of doing this.

                        Dim MaxRow As Integer = 0
                        Dim MaxRowValue As Integer = 0
                        Dim MinRow As Integer = 999999
                        Dim MinRowValue As Integer = 999999
                        For Each MinMaxitem As RowsFound In ListOfRows
                            If MinMaxitem.LineValue < MinRowValue Then
                                MinRow = MinMaxitem.RowIndex
                                MinRowValue = MinMaxitem.LineValue
                            End If
                            If MinMaxitem.LineValue > MaxRowValue Then
                                MaxRow = MinMaxitem.RowIndex
                                MaxRowValue = MinMaxitem.LineValue
                            End If
                        Next

Thank you :)

Upvotes: 1

Views: 8699

Answers (2)

Jonathan Applebaum
Jonathan Applebaum

Reputation: 5996

you can use Lambda Expressions:

  1. first find the maximum \ Minimum value of LineValue using Max() and Min()

  2. find the index of the desired value using FindIndex()

    Private Function getMaxValueIndex() As Integer
    Dim maxValue As Integer = Test.Max(Function(t) t.LineValue)
    Dim maxValueIndex As Integer = Test.FindIndex(Function(t) t.LineValue = maxValue)
    Return maxValueIndex
    End Function
    
    Private Function getMinValueIndex() As Integer
    Dim minValue As Integer = Test.Min(Function(t) t.LineValue)
    Dim minValueIndex As Integer = Test.FindIndex(Function(t) t.LineValue = minValue)
    Return minValueIndex
    End Function
    

Upvotes: 1

An easy way to do this would be to use LINQ:

Public Class RowsFound
    Property RowIndex As Integer
    Property Qty As Integer
    Property LineValue As Double
    Public Sub New(i As Integer, q As Integer, v As Double)
        Me.RowIndex = i
        Me.Qty = q
        Me.LineValue = v
    End Sub
End Class
Dim Test As New List(Of RowsFound) From {New RowsFound(0, 1, 105.25), New RowsFound(1, 2, 100), New RowsFound(2, 1, 110), New RowsFound(3, 2, 60.25)}


Dim RowIndexMax As Integer = (From row As RowsFound In Test.OrderByDescending(Function(x) x.LineValue) Select row.RowIndex).First
Dim RowindexMin As Integer = (From row As RowsFound In Test.OrderBy(Function(x) x.LineValue) Select row.RowIndex).First

Upvotes: 0

Related Questions