扁平化LINQ查询结果列表的有效方法

时间:2020-03-17 15:00:41

标签: vb.net list linq flatten

我正在尝试使用以下代码来简化查询结果:

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 个答案:

答案 0 :(得分:1)

如果您从每个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,但保留内部查询deferred,即在需要结果时执行。每个延迟查询都会扫描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实例化了),我们大大减少了所需的嵌套循环处理数。