1

I am developing a routine to calculate the proper futures contract front month If i have a array of integers denoting month numbers ie, "1,4,7,10,12" and I have a variable integer that is 2.

How do i test the variable against the array and change the variable to the next highest available in the array if the variable itself wasn't in the array? ie in this case the variable's value of 2 would become 4.

I've tried various ways but am stuck now

If datenum >= (targetdayofmonth + adjdays) Then
        currentmonth = currentmonth + 1
        Dim currmonthname As String = MonthName(currentmonth, True)
        For x As Integer = 0 To contractmonths.Count - 1
            If GetMonthNumberfromShortMonthName(contractmonths(x)) = currentmonth Then
                currmonthname = currmonthname
            Else

            End If
        Next
    Else
        Dim currmonthname As String = MonthName(currentmonth, True)
    End If

So based on Tim's comments I've updated the code to;

 Dim contractmonthNos As New List(Of Int32)
    For Each childnode As XmlNode In From childnode1 As XmlNode In root Where childnode1.SelectSingleNode("futures/symbol/Code").InnerText = commodcode
        'get the available contract months for this contract
        Dim contractmonthnodes As XmlNode = childnode.SelectSingleNode("ContractMonths")
        contractmonthNos.AddRange(From subnode As XmlNode In contractmonthnodes Select GetMonthNumberfromShortMonthName(subnode.Name))
    Next
If datenum >= (targetdayofmonth + adjdays) Then
        currentmonth = currentmonth + 1
        Dim currmonthname As String = MonthName(currentmonth, True)
    Else
        Dim nextmonth = From month As Integer In contractmonthNos Where month >   currentmonth
        If nextmonth.Any() Then
            currentmonth = nextmonth.First()
        End If
        Dim currmonthname As String = MonthName(currentmonth, True)
    End If

but I am getting a VS2012 squiggly under nextmonth in the If Then Else warning of "Possible multiple enumeration of IEnumerable"

4

2 回答 2

3

我认为这就是你想要的:

Dim intVar = 2
Dim months = { 1,4,7,10,12 }
Dim higherMonths = months.Where(Function(month) month > intVar).ToArray()
If higherMonths.Any() Then
    intVar = higherMonths.First()
End If

如果您不想要数组中的下一个可用月份,但您必须先排序最近的月份:

Dim higherMonths = months.Where(Function(m) m> intVar).
                          OrderBy(Function(m) m).
                          ToArray()
If higherMonths.Any() Then
    intVar = higherMonths.First()
End If
于 2013-05-16T08:56:33.390 回答
0

就像是

Module Module1

    Sub Main()
        ' N.B. this needs to the array to be sorted.
        Dim a() As Integer = {1, 4, 7, 10, 12}
        Dim toFind As Integer = 2
        Dim foundAt As Integer = -1
        For i = 0 To a.Length() - 1
            If a(i) >= toFind Then
                foundAt = i
                Exit For
            End If
        Next

        If foundAt >= 0 Then
            Console.WriteLine(String.Format("Looked for {0}, found {1}.", toFind, a(foundAt)))
        Else
            Console.WriteLine(String.Format("Did not find {0} or higher.", toFind))
        End If

        Console.ReadLine()

    End Sub

End Module

或者您可能想看看使用Array.BinarySearch Method

于 2013-05-16T09:07:21.197 回答