如何清除 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
所有这三个查询都存储为逻辑,而不是对象。当您枚举 maleQuery
或 femaleQuery
时,您正在执行该逻辑并一一获取结果。在每种情况下,都会执行存储在 baseQuery
中的逻辑以及更具体的查询中的逻辑,因此您可以同时应用两个过滤器。
编辑:我应该澄清一下,您不能通过该界面清除 IEnumerable(Of T)
。例如,List(Of T)
实现了 IEnumerable(Of T)
接口,您可以清除它,但正是 class 提供了该功能。如果您对一个对象的全部了解是它实现了 IEnumerable(Of T)
,那么您无法清除它,因为您不知道它是否具有该接口定义的功能之外的功能。 LINQ 查询肯定没有这样的功能,因为没有要清除的实际具体列表。
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
所有这三个查询都存储为逻辑,而不是对象。当您枚举 maleQuery
或 femaleQuery
时,您正在执行该逻辑并一一获取结果。在每种情况下,都会执行存储在 baseQuery
中的逻辑以及更具体的查询中的逻辑,因此您可以同时应用两个过滤器。
编辑:我应该澄清一下,您不能通过该界面清除 IEnumerable(Of T)
。例如,List(Of T)
实现了 IEnumerable(Of T)
接口,您可以清除它,但正是 class 提供了该功能。如果您对一个对象的全部了解是它实现了 IEnumerable(Of T)
,那么您无法清除它,因为您不知道它是否具有该接口定义的功能之外的功能。 LINQ 查询肯定没有这样的功能,因为没有要清除的实际具体列表。