2016-01-26 33 views
0

我編寫了這個嵌套的IIF語句來確定包含URL的字符串是否包含http://或https://以便我可以包含它必要。我的嵌套的IIF語句沒有在VB.NET中修改字符串

IIf(urlLong.Contains("http://"), Nothing, _ 
      IIf(urlLong.Contains("https://"), Nothing, _ 
       urlLong = "http://" + urlLong)) 

但是,當運行這個我得不到結果。我試圖重新寫它以獲得儘可能簡單的IIF聲明,但即使這樣也無法按預期工作。

IIf(urlLong.Contains(urlLong), Nothing, urlLong = "http://" + urlLong) 

這會導致我相信我不太瞭解IIF聲明如何工作。我得到的代碼創建一個功能起作用添加的「http://」,現在我的代碼看起來像這樣

IIf(urlLong.Contains("http://"), urlLong = urlLong, _ 
     IIf(urlLong.Contains("https://"), urlLong = urlLong, _ 
      addHttp(urlLong))) 

凡addHttp需要urlLong的ByRef,並增加了HTTP://

Private Function addHttp(ByRef urlLong As String) As String 
    urlLong = "http://" + urlLong 
    Return urlLong 
End Function 

所以,我的問題是,爲什麼第一個IIf聲明不能在第二個聲明中工作,並且有沒有其他方法可以做到這一點,這會被認爲是更好的「最佳實踐」?

+2

不要在VB.NET中使用IIF,具有短路評估的三元運算符是_IF(expression,true,false)_ – Steve

回答

0

IIF已經返回值應該使用這樣的:

var newUrl = IIf(urlLong.Contains("http://"), urlLong, addHttp(urlLong)) 
+0

當然!我花了最後的45分鐘閱讀關於IIf如何是一個功能等,仍然設法錯過。謝謝! – Rob

0

IIF不會以您嘗試使用它的方式工作。它等效於以下內容:

Public Function IIF(evaluator as Boolean, resultIfTrue As Object, resultIfFalse As Object) As Object 
    Dim trueResult As Object = resultIfTrue 
    Dim falseResult As Object = resultIfFalse 
    If evaluator Then 
     Return resultIfTrue 
    Else 
     Return resultIfFalse 
    End If 
End Function 

所以你可以嵌套另一個IIF在resultIfFalse部分,但你需要的最終結果指派回這樣的變量:

Dim result = IIF(test, "worked", IIF(test2, "worked", "failed")) 

請注意,您應該真的使用.Net中的If運算符。用法基本相同,但是它是安全和更高效的。

Dim result = If(test, "worked", If(test2, "worked", "failed"))