Если вы переключитесь с просмотра списка plctags
для каждого элемента listHmisNum
, наоборот, улучшится ли производительность?
Dim listHmisNum = (From plc In plctags
Where plc.xType.ToUpper.Contains("HMINUM")
Select plc.xName).ToList
Dim flattenList = (From plc In plctags
Where listHmisNum.Any(Function (n) plc.xName.Contains(n)) And plc.xValue <> "{...}"
Select plc).ToList
Рассмотрите исходный код:
Dim listHmisNums = (From hmisnum In listHmisNum
Select (From plc In plctags
Where plc.xName.Contains(hmisnum.xName) And
plc.xValue <> "{...}")).ToList
Если вы рассмотрите тип listHmisNums
, вы увидите, что это List<IEnumerable<Tplctags>>
. ToList
создает экземпляр внешнего From
... Select
, но оставляет внутренний запрос отложенный , т. Е. Должен выполняться, когда требуются результаты. Каждый отложенный запрос сканирует элементы plctags
и извлекает соответствующие.
Dim flattenList = (From list In listHmisNums
From item In list
Select item).ToList
Теперь flattenList
имеет тип List<Tplctags>
, а list
имеет тип IEnumerable<Tplctags>
и откладывается. Когда этот запрос выполняется, результаты обрабатываются для каждого отложенного запроса в запросе listHmisNums
. Таким образом, если в listHmisNum
4000 элементов, то оценка 4000 отложенных запросов означает сканирование всех элементов plctags
4000 раз для получения 40
соответствующих элементов.
Переписав запрос для сканирования plctags
один раз и найдя первое совпадение (Any
) в listHmisNums
, которое уже было создано с использованием ToList
, мы значительно сократили количество необходимых вложенных операций обработки l oop.