【问题标题】:Are LINQ Query Expressions Optimized?LINQ 查询表达式是否优化?
【发布时间】:2019-01-09 13:32:55
【问题描述】:

LINQ 是否通过排序/转换数据结构进行任何优化?

LINQ 是否在此代码中进行迭代,或者是否对数据进行了任何类型的排序/转换以优化查找操作?

var list = new List<IdCard> {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } };

var idA = list.FirstOrDefault(id => id.Name == "a");
var idB = list.FirstOrDefault(id => id.Name == "b");

我试图了解我的 LINQ 代码是否直接转换为迭代方法。如果是,那么上面的代码最好使用字典查找(假设有很多查找)而不是依赖 LINQ,对吧?

【问题讨论】:

  • 您可以通过将鼠标悬停在方法上并在 Visual Studio 中按 f12 来查看 FirstOrDefault 方法在幕后的作用。然后,您可以检查天气您的方法是否有效。但是要摆脱多次查找,您可以使用 where 和 contains,您可以将 id 列表传递给 contains 方法。

标签: c# linq c#-4.0


【解决方案1】:

感谢您的回答!它们信息量很大。

看起来这个查询的答案确实是某些 LINQ 代码可能会被优化,最好的检查方法是简单地查看源代码。

如果我错了,请纠正我,但代码似乎在这里可用:

https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs

【讨论】:

    【解决方案2】:

    不,所有带有谓词参数的System.Linq 扩展都会枚举源集合,并且不要修改或优化源集合。某些情况,例如 OrderBy、GroupBy 和 Intersect 使用本地集合来防止多次枚举源。

    Lookup(类似于Dictionary&lt;K, List&lt;V&gt;&gt;)可以用作alternative to Dictionary

    var list = new List<IdCard> {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } };
    var lookup = list.ToLookup(c => c.Name);
    
    var idA = lookup["a"].FirstOrDefault();
    var idB = lookup["b"].FirstOrDefault();
    

    【讨论】:

    • Lookup 旨在具有与任何给定键关联的值的序列。这似乎不是这里的情况。如果您想在不确定字典是否存在时从字典中获取值,您可以简单地使用TryGetValue
    • 这实际上也没有回答 OP 中的问题。他们并没有询问如何使用不同的集合而不是 LINQ 操作来更有效地执行这些查询。他们询问 LINQ 做什么,以及他们是否需要编写代码以自己使用不同的集合。
    【解决方案3】:

    LINQ 是否通过排序/转换数据结构进行任何优化?

    是的。在各种 LINQ 方法中进行了各种优化。

    LINQ 是否在此代码中迭代

    是的。

    是否对数据进行了任何类型的排序/转换以优化查找操作?

    没有。以某种排序或散列的方式构建一个全新的数据结构所花费的工作将比仅仅迭代序列直到找到第一个项目更多。在 LINQ 实现中创建一个集合不仅会增加每个项目的处理工作(因为您不仅要执行谓词,而且还要执行集合需要做的任何工作以供以后存储它),并通过存储使用更多内存这些项目的时间更长,但您不能在找到匹配项后立即退出,就像通过简单的迭代一样。

    那么上面的代码最好使用字典查找(假设有很多查找)而不是依赖 LINQ,对吧?

    是的,如果您只是使用一种本机提供最有效地执行您想要在该集合上执行的操作的类型来构建集合,那么该代码会更好(在这种情况下,一个基于键,所以是字典或排序字典),而不是使用不正确的集合类型和使用 LINQ 方法。

    当为您拥有的任何集合(或可以拥有,如果您可以控制您使用的集合)查找所需内容的最佳算法与您为任何集合使用的算法相同时,使用 LINQ 非常有用。任意序列。在很多情况下都是如此。这不是其中一种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多