如何清除IEnumerable

时间:2018-12-11 22:19:15

标签: vb.net ienumerable

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可以防止这种情况。有没有办法做到这一点?或者,如何使每个查询仅输出该查询的结果,而不输出先前查询的结果?

1 个答案:

答案 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

所有这三个查询都存储为逻辑而不是对象。枚举maleQueryfemaleQuery时,就是在执行该逻辑并逐一获取结果。在每种情况下,都执行baseQuery中存储的逻辑以及更具体的查询中的逻辑,因此您可以同时应用两个过滤器。

编辑:我要澄清说一下,您不能通过该界面清除IEnumerable(Of T)。例如,一个List(Of T)实现了IEnumerable(Of T)接口,您可以清除它,但是提供该功能的是该类。如果您仅了解对象实现了IEnumerable(Of T),那么您将无法清除它,因为您不知道该对象是否具有该接口定义的功能。 LINQ查询绝对不具有这种功能,因为没有实际的具体列表需要清除。