Как очистить содержимое IEnumerable - PullRequest
0 голосов
/ 12 декабря 2018
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 голосов
/ 12 декабря 2018

Вы не можете очистить 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 определенно нет такой функциональности, потому что нет конкретного конкретного списка для очистки.

...