如何通过连接加快此LINQ查询?

问题描述 投票:3回答:2

我有两个对象模型集合,我正在按属性比较不平等。

ObservableCollection<LayerModel> SourceDrawingLayers

...和:

ObservableCollection<LayerModel> TargetDrawingLayers

我通常在创建非等分LINQ查询时收到了很好的建议,并使其在我的应用程序中发挥了很大的作用,但是现在我想加快它的速度:

var onOffQuery = from target in TargetDrawingLayers
                 from source in SourceDrawingLayers
                 where target.Name == source.Name && target.OnOff != source.OnOff
                 select target;

[我的理解是,我将查询乘以源图形*中的项目数,目标图形中的项目数*我填充到TargetDrawingLayers中的目标图形数。

我想使用Join加快此操作的速度,但是我遇到了!=部分的问题。

我玩这个:

var newQuery = from source in SourceDrawingLayers
    join target in TargetDrawingLayers
    on target.name
    where target.OnOff != source.OnOff
    select target;

但是我在语法上苦苦挣扎。有人可以将我设置在正确的轨道上吗?

而且,这甚至会带来明显的性能改进吗?

c# linq observablecollection
2个回答
5
投票

on target.name替换on source.name equals target.name

var newQuery = from source in SourceDrawingLayers
         join target in TargetDrawingLayers
         on source.name equals target.name
         where target.OnOff != source.OnOff
         select target;

在Linq-to-objects中,联接将在联接属性上创建Lookup<TKey,TElement>,这将在匹配Lookup<TKey,TElement>source时提高性能。假设此结果是在有限的结果集上得出的,它应该可以使原始代码有所改善。当然,如果由于target两端都包含非常有限的值范围而导致许多匹配,则性能根本不会受到太大影响。

作为参考,请参阅juharr在下面的注释中提供的name源代码。


0
投票

也许您需要结合the link to the Enumerable.csName属性的组合。组合可以表示为OnOff

ValueTuple
© www.soinside.com 2019 - 2024. All rights reserved.