如何清除 IEnumerable 的内容

How to clear the contents of an 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 对象。对象 class 是结果,resultList 是该对象的许多实例的列表。为了执行多个查询,我打算重复这段代码,但条件不同。

重复此代码时,除了先前搜索的所有结果外,它还会输出该搜索的结果。我相信清除查询之间的 IEnumerable 可以防止这种情况发生。有没有办法做到这一点?或者,我怎样才能使每个查询只输出该查询的结果,而不输出先前查询的结果?

您无法清除 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) 接口,您可以清除它,但正是 class 提供了该功能。如果您对一个对象的全部了解是它实现了 IEnumerable(Of T),那么您无法清除它,因为您不知道它是否具有该接口定义的功能之外的功能。 LINQ 查询肯定没有这样的功能,因为没有要清除的实际具体列表。