如何清除 IEnumerable 的内容

Oly*_*Dun 3 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
Run Code Online (Sandbox Code Playgroud)

我创建了一个通用IEnumerable的对象。对象类是结果,resultList是该对象的许多实例的列表。为了执行多个查询,我打算重复此代码,但条件不同。

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

jmc*_*ney 5

您无法清除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
Run Code Online (Sandbox Code Playgroud)

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

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