如何使用 join 加速这个 LINQ 查询?

Kef*_*fka 3 c# linq observablecollection

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

ObservableCollection<LayerModel> SourceDrawingLayers
Run Code Online (Sandbox Code Playgroud)

...和:

ObservableCollection<LayerModel> TargetDrawingLayers
Run Code Online (Sandbox Code Playgroud)

我收到了关于创建非 equijoin LINQ 查询的很好的建议,并且让它在我的应用程序中发挥了很大的作用,但现在我想加快速度:

var onOffQuery = from target in TargetDrawingLayers
                 from source in SourceDrawingLayers
                 where target.Name == source.Name && target.OnOff != source.OnOff
                 select target;
Run Code Online (Sandbox Code Playgroud)

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

我想加速这个操作,Join但我遇到!=了它的一部分问题。

我玩弄这个:

var newQuery = from source in SourceDrawingLayers
    join target in TargetDrawingLayers
    on target.name
    where target.OnOff != source.OnOff
    select target;
Run Code Online (Sandbox Code Playgroud)

但我在语法上挣扎。有人可以用它让我走上正轨吗?

此外,这甚至会是显着的性能改进吗?

Igo*_*gor 5

替换on target.nameon 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;
Run Code Online (Sandbox Code Playgroud)

在 Linq-to-objects 中,连接将Lookup<TKey,TElement>在连接属性上创建,这将在匹配source和时提高性能target。假设这导致受限结果集,它应该稍微改进原始代码退出。当然,如果它导致许多匹配,因为name双方包含非常有限的值范围,那么性能根本不会受到太大影响。

作为参考,请参阅juharr 在下面的评论中提供的指向 Enumerable.cs源代码的链接

  • @Çöđěxěŕ 来自问题“但我在语法上遇到了困难。有人能让我走上正确的道路吗?” 请告诉我更多关于问题中如何不涉及语法的信息。 (4认同)
  • 具体来说,这将在名称上创建一个哈希值,以帮助匹配两个集合中的值(因此名称的类型也会影响这一点,我假设它是一个可以正常工作的字符串)。然后它会根据 OnOff 的不同来过滤这些匹配项。 (2认同)
  • @Igor你可以查看源代码,看到它创建了一个“Lookup”来使用https://referencesource.microsoft.com/#system.core/system/linq/Enumerable.cs,aecc63c3873b5c1a (2认同)