LINQ 查询表达式是否优化?

Are LINQ Query Expressions Optimized?

LINQ 是否通过 sorting/converting 数据结构进行任何优化?

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

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,对吗?

Does LINQ do any optimization by sorting/converting data structures?

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

Does LINQ iterate in this code

是的。

is there any type of sorting/conversion done on the data to optimize the find operation?

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

then it would be better for the above code to use a dictionary lookup (given the case there were to be many look-ups) instead of relying on LINQ, right?

是的,如果您简单地使用一种类型构造集合,该类型本身提供最有效地执行您想对该集合执行的操作的类型(在本例中,基于优化搜索速度的集合)在一个键上,所以要么是字典要么是排序的字典),而不是使用不正确的集合类型和使用 LINQ 方法。

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

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

Lookup(类似于Dictionary<K, List<V>>)可以用作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();

感谢您的回答!他们提供的信息非常丰富。

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

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

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