如何通过join加速此LINQ查询?

我有两个对象模型集合,我正在针对每个属性比较它们的不平等性。

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;

我的理解是,我要将查询乘以源图形中的项目数*和目标图形中的项目数*,并将我填充到{{1 }}。

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

我玩这个:

!=

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

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

WOSHI555 回答:如何通过join加速此LINQ查询?

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>,这将在匹配sourcetarget时提高性能。假设此结果是在有限的结果集上得出的,它应该可以使原始代码有所改善。当然,如果由于name两端都包含非常有限的值范围而导致许多匹配,则性能根本不会受到太大影响。

作为参考,请参见juharr在下面的注释中提供的the link to the Enumerable.cs源代码。

,

也许您需要加入属性NameOnOff的组合。组合可以表示为ValueTuple

var newQuery = from source in SourceDrawingLayers
               join target in TargetDrawingLayers
               on (source.Name,source.OnOff) equals (target.Name,!target.OnOff)
               select target;
本文链接:https://www.f2er.com/2924323.html

大家都在问