2012-10-10 29 views
-8

我有這樣的情況,如果數量少於1000,20上來 1001-2000,40上來 2001-3000,60過程中出現的另一個文本框展望VB.Net

我正在尋找合適的配方。

If number <= 1000 Then 
    Return 20 
ElseIf number <= 2000 Then 
    Return 40 
ElseIf number <= 3000 Then 
    Return 60 
ElseIf number <= 4000 Then 
    Return 80 
ElseIf number <= 5000 Then 
    Return 100 
ElseIf number <= 6000 Then 
    Return 120 
ElseIf number <= 7000 Then 
    Return 140 
ElseIf number <= 8000 Then 
    Return 160 
ElseIf number <= 9000 Then 
    Return 180 
ElseIf number <= 10000 Then 
    Return 200 
ElseIf number <= 11000 Then 
    Return 220 
ElseIf number <= 12000 Then 
    Return 240 
ElseIf number <= 13000 Then 
    Return 260 
ElseIf number <= 14000 Then 
    Return 280 
ElseIf number <= 15000 Then 
    Return 300 
End If 
+0

守ld最後的回報是'240'而不是'220'? – Curt

+0

@Ivinvin對於每種情況,你的結果增加20? – freebird

+0

@raman一個switch語句在這裏不會改變任何東西。 – James

回答

1

這裏是你的答案:

VB.Net:

If (number Mod 1000 = 0) 
    result = 20 * (number/1000) 
Else 
    result = 20 * (number/1000 + 1) 

C#:

if (number % 1000 == 0) 
    result = 20 * (number/1000); 
else 
    result = 20 * (number/1000 + 1); 
+0

VB模運算符是'Mod'而不是'%'。但無論如何[Jon Egerton的anwer](http:// stackoverflow。com/a/12817191/15639)短得多 – MarkJ

+0

其基於C#的語法,我懷疑Jon的答案中有一個案例缺失,編號爲%1000 == 0,不確定VB.Net中的弱點 –

0

我不能讓任何短於:

Return ((number \ 1000) + 1) * 20 
+0

這是行不通的。如果數字是1,則應返回20。 – Curt

+0

你錯了,它不是線性依賴 –

+0

是的 - 只需要處理badary條件。 –

0

首先,你需要將該數字四捨五入到最接近千元,所以我們得到一致的結果。

(Math.Ceiling(number/1000)*1000) 

然後假設你的意思是20,每次遞增(我見過的意見指不正確的值),可以通過50

因此劃分:

Return (Math.Ceiling(number/1000)*1000)/50 
0

您可以使用自定義的Range類和Dicitonary來存儲範圍+值:

Function GetValue(number As Int32) As Int32 
    Dim rangeValues = New Dictionary(Of Range(Of Int32), Int32) 
    rangeValues.Add(New Range(Of Int32)(1000), 20) 
    rangeValues.Add(New Range(Of Int32)(1001, 2000), 40) 
    rangeValues.Add(New Range(Of Int32)(2001, 3000), 60) 
    rangeValues.Add(New Range(Of Int32)(3001, 4000), 80) 
    rangeValues.Add(New Range(Of Int32)(4001, 5000), 40) 
    rangeValues.Add(New Range(Of Int32)(5001, 6000), 40) 
    rangeValues.Add(New Range(Of Int32)(6001, 7000), 60) 
    rangeValues.Add(New Range(Of Int32)(7001, 8000), 80) 
    rangeValues.Add(New Range(Of Int32)(8001, 9000), 100) 
    rangeValues.Add(New Range(Of Int32)(9001, 10000), 120) 
    rangeValues.Add(New Range(Of Int32)(10001, 11000), 140) 
    rangeValues.Add(New Range(Of Int32)(11001, 12000), 160) 
    rangeValues.Add(New Range(Of Int32)(12001, 13000), 180) 
    rangeValues.Add(New Range(Of Int32)(13001, 14000), 200) 
    rangeValues.Add(New Range(Of Int32)(14001, 15000), 220) 

    Dim firstMatchingRange = rangeValues.Keys. 
     FirstOrDefault(Function(r) r.Minimum <= number AndAlso r.Maximum >= number) 
    If firstMatchingRange IsNot Nothing Then 
     Return rangeValues(firstMatchingRange) 
    Else 
     Throw New ArgumentException("invalid number", "number") 
    End If 
End Function 

這裏的Range

Public Class Range(Of T As IComparable(Of T)) 
    Public Sub New() 
    End Sub 
    Public Sub New(minimum As T, maximum As T) 
     minimum = minimum 
     maximum = maximum 
    End Sub 
    Public Sub New(maximum As T) 
     maximum = maximum 
    End Sub 

    ''' <summary> 
    ''' Minimum value of the range 
    ''' </summary> 
    Public Property Minimum() As T 
     Get 
      Return m_Minimum 
     End Get 
     Set(value As T) 
      m_Minimum = value 
     End Set 
    End Property 
    Private m_Minimum As T 

    ''' <summary> 
    ''' Maximum value of the range 
    ''' </summary> 
    Public Property Maximum() As T 
     Get 
      Return m_Maximum 
     End Get 
     Set(value As T) 
      m_Maximum = value 
     End Set 
    End Property 
    Private m_Maximum As T 

    ''' <summary> 
    ''' Presents the Range in readable format 
    ''' </summary> 
    ''' <returns>String representation of the Range</returns> 
    Public Overrides Function ToString() As String 
     Return [String].Format("[{0} - {1}]", Minimum, Maximum) 
    End Function 

    ''' <summary> 
    ''' Determines if the range is valid 
    ''' </summary> 
    ''' <returns>True if range is valid, else false</returns> 
    Public Function IsValid() As [Boolean] 
     Return Minimum.CompareTo(Maximum) <= 0 
    End Function 

    ''' <summary> 
    ''' Determines if the provided value is inside the range 
    ''' </summary> 
    ''' <param name="value">The value to test</param> 
    ''' <returns>True if the value is inside Range, else false</returns> 
    Public Function ContainsValue(value As T) As [Boolean] 
     Return (Minimum.CompareTo(value) <= 0) AndAlso (value.CompareTo(Maximum) <= 0) 
    End Function 

    ''' <summary> 
    ''' Determines if this Range is inside the bounds of another range 
    ''' </summary> 
    ''' <param name="Range">The parent range to test on</param> 
    ''' <returns>True if range is inclusive, else false</returns> 
    Public Function IsInsideRange(Range As Range(Of T)) As [Boolean] 
     Return Me.IsValid() AndAlso Range.IsValid() AndAlso Range.ContainsValue(Me.Minimum) AndAlso Range.ContainsValue(Me.Maximum) 
    End Function 

    ''' <summary> 
    ''' Determines if another range is inside the bounds of this range 
    ''' </summary> 
    ''' <param name="Range">The child range to test</param> 
    ''' <returns>True if range is inside, else false</returns> 
    Public Function ContainsRange(Range As Range(Of T)) As [Boolean] 
     Return Me.IsValid() AndAlso Range.IsValid() AndAlso Me.ContainsValue(Range.Minimum) AndAlso Me.ContainsValue(Range.Maximum) 
    End Function 
End Class