Dim sortQuery = From results In resultList
Order By results.getUsername()
Where results.getUsername() = passUsername
Select results.getAll()
For Each Str As String In sortQuery
lstBox.Items.Add(Str)
Next
我已经创建了对象的通用IEnumerable
。对象类是结果,resultList
是该对象的许多实例的列表。为了执行多个查询,我打算在不同的条件下重复此代码。
重复此代码时,除了先前搜索的所有结果之外,它还会输出该搜索的结果。我相信清除查询之间的IEnumerable
可以防止这种情况。有没有办法做到这一点?或者,如何使每个查询仅输出该查询的结果,而不输出先前查询的结果?
答案 0 :(得分:3)
您无法清除IEnumerable(Of T)
。该界面仅表示您可以枚举项目列表。它没有说明这些项目的存储方式。对于LINQ查询,不是存储项目,而是有关如何从源列表中获取项目的信息。执行查询产生的项目列表不会单独存储在任何要清除的地方,而是通过每次应用查询逻辑生成的。
如果要执行类似但不同的查询,则需要创建多个查询。您可以创建一个包含通用逻辑的基本查询,然后可以将特定部分应用于每个特定查询。例如,如果您想从一个列表中获取所有Person
对象,但又希望将男性和女性分开,则可以这样做:
Dim baseQuery = From person In people
Where person.FamilyName = "Smith"
Dim maleQuery = From person In baseQuery
Where person.Sex = Sex.Male
Dim femaleQuery = From person In baseQuery
Where person.Sex = Sex.Female
所有这三个查询都存储为逻辑而不是对象。枚举maleQuery
或femaleQuery
时,就是在执行该逻辑并逐一获取结果。在每种情况下,都执行baseQuery
中存储的逻辑以及更具体的查询中的逻辑,因此您可以同时应用两个过滤器。
编辑:我要澄清说一下,您不能通过该界面清除IEnumerable(Of T)
。例如,一个List(Of T)
实现了IEnumerable(Of T)
接口,您可以清除它,但是提供该功能的是该类。如果您仅了解对象实现了IEnumerable(Of T)
,那么您将无法清除它,因为您不知道该对象是否具有该接口定义的功能。 LINQ查询绝对不具有这种功能,因为没有实际的具体列表需要清除。