2009-09-10 62 views
0

例子,我有一個個人類如何獲得LAMBDA在LINQ實際篩選動態LINQ

Public Class Person 
Private _fname As String 
Public Property Fname() As String 
    Get 
     Return _fname 
    End Get 
    Set(ByVal value As String) 
     _fname = value 
    End Set 
End Property 
Private _lname As String 
Public Property Lname() As String 
    Get 
     Return _lname 
    End Get 
    Set(ByVal value As String) 
     _lname = value 
    End Set 
End Property 
Private _age As Integer 
Public Property Age() As Integer 
    Get 
     Return _age 
    End Get 
    Set(ByVal value As Integer) 
     _age = value 
    End Set 
End Property 

末級

Dim people As New List(Of Person) 
    people.Add(New Person With {.Fname = "Alice", .Lname = "Apples", .Age = 1}) 
    people.Add(New Person With {.Fname = "Bob", .Lname = "Banana", .Age = 2}) 
    people.Add(New Person With {.Fname = "Charlie", .Lname = "Cherry", .Age = 3}) 
    people.Add(New Person With {.Fname = "Dave", .Lname = "Durian", .Age = 4}) 
    people.Add(New Person With {.Fname = "Eric", .Lname = "EggPlant", .Age = 10}) 

    Dim filteredPerson = From person In people 
    filteredPerson.Where(Function(fp) fp.Fname = "Bob") 

    Dim finalList = filteredPerson.ToList 
    For Each p In finalList 
     Debug.Print("FNAME: " + p.Fname) 
    Next 

這仍然返回所有5人,喜歡在那裏不被應用,我做錯了什麼?

我也想能夠通過名稱列表,並只返回

Dim searchList As New List(Of String) 
    searchList.Add("Bob") 
    searchList.Add("Dave") 

    Dim filteredPerson = From person In people 
    For Each s In searchList 
     Dim innerName As String = s 
     filteredPerson.Where(Function(fp) fp.Fname = innerName) 
    Next 
    Dim finalList = filteredPerson.ToList 
    For Each p In finalList 
     Debug.Print("FNAME: " + p.Fname) 
    Next 

回答

2

的問題是,如果不變化集合。它返回新過濾的集合。

試試這個:

Dim filteredPerson = people.Where(Function(fp) fp.Fname = "Bob") 

(順便說一句,我沒有你在哪裏使用動態LINQ看到任何動態這裏......?)

要添加多個Where子句, 「會想是這樣的:

Dim searchList As New List(Of String) 
searchList.Add("Bob") 
searchList.Add("Dave") 

Dim filteredPerson As IEnumerable(Of String) = people 
For Each s In searchList 
    Dim innerName As String = s 
    filteredPerson = filteredPerson.Where(Function(fp) fp.Fname = innerName) 
Next 
Dim finalList = filteredPerson.ToList 
For Each p In finalList 
    Debug.Print("FNAME: " + p.Fname) 
Next 

不過,我不相信這是實際上你想要做什麼。每個Where條款將堅持Fname是指定的名稱 - 它不會是鮑勃戴夫!我想你真正想要的東西可以更簡單地表示:

Dim searchList As New List(Of String) 
searchList.Add("Bob") 
searchList.Add("Dave") 

Dim filteredPerson = people.Where(Function(fp) searchList.Contains(fp.Fname)) 
Dim finalList = filteredPerson.ToList 
For Each p In finalList 
    Debug.Print("FNAME: " + p.Fname) 
Next 

所有我們想知道的是Fname是否searchList,這是什麼呢Contains

+0

它是在最後的代碼段中,我希望能夠傳遞名稱列表,添加每個名稱的where子句,在該示例中,我期望列出(Person)列表中的2個項目Bob &Dave – Eric 2009-09-10 16:51:53

+0

就是這樣!這正是我想傳達的。謝謝 – Eric 2009-09-10 16:55:22

+0

@Jon:我不知道語法。你可以用JOIN來舉例說明第二種情況嗎? – shahkalpesh 2009-09-10 16:55:31

0
Dim people As New List(Of Person) 
people.Add(New Person With {.Fname = "Alice", .Lname = "Apples", .Age = 1}) 
people.Add(New Person With {.Fname = "Bob", .Lname = "Banana", .Age = 2}) 
people.Add(New Person With {.Fname = "Charlie", .Lname = "Cherry", .Age = 3}) 
people.Add(New Person With {.Fname = "Dave", .Lname = "Durian", .Age = 4}) 
people.Add(New Person With {.Fname = "Eric", .Lname = "EggPlant", .Age = 10}) 

Dim searchList As New List(Of String) 
searchList.Add("Bob") 
searchList.Add("Dave") 

dim filteredItems = from p in people _ 
join i in searchList on p.FName equals i _ 
select p 

dim personFound as Person 

for each personFound in filteredItems 
    Console.WriteLine(personFound.Lname) 
next