2017-04-11 86 views
1

我有兩個按過濾器順序不同的LINQ查詢。我想避免使用嵌套的If語句。如何使用LINQ過濾對象列表而不使用嵌套If語句

我目前的aproach是:

If (userlist.count > 0) Then 
    If (Filter()) Then 
     users = From u In userlist Order By (If(u.name) username,1,0) 
       descending u.name ascending 
    Else 
     users = From u In userlist 
       Select u.name Distinct Order By u.name Ascending 
    End If 
Else 
    users = New List(Of String) 
End If 
+1

使用三元運算符?它看起來很亂,但是...也許創建一個函數來處理Linq查詢。這將是相當整潔。 –

+1

你的代碼有一堆我可以告訴的錯誤 - If(沒有3個參數,If()之後的神祕用戶名引用,第二個From中的Order By之前的選擇,用戶的不同數據類型那麼和其他部分的嵌套if? – NetMage

回答

0

如果我理解正確你只是想避免嵌套if語句。 您可以通過使用函數並在條件有效時立即使用Return函數來實現此目的。

Function GetUserNames(userList As List(Of UserList), username As String) 
    If (userList Is Nothing OrElse Not userList.Any()) Then 
     Return New List(Of String) 
    End If 

    If Filter() Then 
     Return From u In userList Order By (If(u.Name = username, 1, 0)) Descending, u.Name Ascending 
    End If 

    Return From u In userList 
      Select u.Name Distinct 
      Order By Name Descending 
End Function 

注意,您沒有嵌套的if語句,實際上您也不需要else部分。

同時利用linq構建語句。假設獨立的名稱應適用於這兩個查詢:

Dim query = userList.Select(Function(u) u.Name).Distinct 

    If Filter() Then 
     Return query.OrderByDescending(Function(n) If(n = username, 1, 0)).ThenBy(Function(n) n) 
    End If 

    Return query.OrderBy(Function(n) n) 

- 更新 -

賞金詢問「..答案來自可信的和/或官方渠道畫畫。」。這就是爲什麼我已經包括馬丁·福勒,的文章的鏈接,其中是這樣描述的設計:

https://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html

0

我更喜歡使用Select Case語句在我的LINQ查詢的SortOrderBy一部分,因爲它更容易閱讀:

Select Case search.Sort 
    Case "Name" 
     OutputList = OutputList.OrderBy(Function(x) x.Name).ToList() 

    Case "-Name" 
     OutputList = OutputList.OrderByDescending(Function(x) x.Name).ToList() 

    Case "Date" 
     OutputList = OutputList.OrderBy(Function(x) x.[Date]).ToList() 

    Case "-Date" 
     OutputList = OutputList.OrderByDescending(Function(x) x.[Date]).ToList() 

    Case "Percent" 
     OutputList = OutputList.OrderBy(Function(x) x.CompletedPercentage).ToList() 

    Case "-Percent" 
     OutputList = OutputList.OrderByDescending(Function(x) x.CompletedPercentage).ToList() 

End Select 
0

假設我正確地解釋你的代碼,爲什麼不去掉所有的if語句?

Dim sortUsername = If(Filter(), "", username) 
    users = (From u In userlist Order By If(u.name > sortUsername, 1, 0) Descending, u.name Ascending Select u.name Distinct).ToList 
0

您可以在LINQ中使用let關鍵字,並有一個變量用於決策。