我正在尝试使用以下代码来简化查询结果:
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
变大时,要永远展平它。
我想知道您是否有更有效的扁平化方法?
我查询数据的方式也可能出错。
答案 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
实例化了),我们大大减少了所需的嵌套循环处理数。