我有两个对象模型集合,我正在按属性比较不平等。
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;
但是我在语法上苦苦挣扎。有人可以将我设置在正确的轨道上吗?
而且,这甚至会带来明显的性能改进吗?
用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
源代码。
也许您需要结合the link to the Enumerable.cs和Name
属性的组合。组合可以表示为OnOff
:
ValueTuple