Эффективный способ сгладить список в результате запроса LINQ - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь сгладить результат моего запроса с помощью этого кода:

Dim listHmisNum = (From plc In plctags
                   Where plc.xType.ToUpper.Contains("HMINUM")).ToList

Dim listHmisNums = (From hmisnum In listHmisNum
                   Select (From plc In plctags
                           Where plc.xName.Contains(hmisnum.xName) And
                           plc.xValue <> "{...}")).ToList

Dim flattenList = (From list In listHmisNums
                               From item In list
                               Select item).ToList

Переменная listHmisNums имеет тип System.Collections.Generic.List(Of System.Collections.Generic.IEnumerable(Of MyType))

Я могу сгладить его, но мой проблема в том, что чтобы сгладить его, понадобится навсегда, когда мой список listHmisNums увеличится.

Мне было интересно, есть ли у вас более эффективный способ его сглаживания?

Возможно, я тоже ошибаюсь как я запрашиваю свои данные.

1 Ответ

1 голос
/ 18 марта 2020

Если вы переключитесь с просмотра списка 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.

...