【问题标题】:Where is the source for System.Linq.Enumerable.ToList()? [closed]System.Linq.Enumerable.ToList() 的来源在哪里? [关闭]
【发布时间】:2019-06-17 04:22:13
【问题描述】:

如果Object 已经是List,我正在查看是否将.ToList() 放在可能是或可能不是列表的IEnumerable 上会导致性能下降。

我的目标是查看源代码。这就是问题的隧道开始的地方。首先我发现了 SO Question Where can I view LINQ source code? [closed] 这导致了 DOTNet 的完整框架版本,但深入研究代码只显示了一个小的 Enumerable 类 Enumerable

问题

以下扩展方法的源代码在哪里?

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);

子问题 1 完整框架版本在哪里?

子问题 2 .net core 版本在哪里?

【问题讨论】:

  • 如果你经常这样做,看看 ReSharper,它有分析这些东西的工具。
  • @Stefan 这里的问题是输入来自我无法控制的东西。所以 Resharper 静态分析在这种情况下不起作用
  • 现在我需要决定什么更好。检查它是否已经是一个列表,或者进行两次枚举。
  • 我建议使用IReadOnlyList&lt;T&gt; 而不是IEnumerable&lt;T&gt;。这使消费者不必担心重复枚举,但可以清楚地表明您不希望他们编辑列表。
  • 我的意思是:使用反编译器。

标签: c# linq


【解决方案1】:

问题 1 全框架版本在哪里?

https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs#L947

问题 2 .net core 版本在哪里?

https://github.com/dotnet/corefx/blob/8750960d3fafa46a9b838c351e995a01fa8b599f/src/System.Linq/src/System/Linq/ToCollection.cs#L23

以上是两个ToList 实现的链接(还有其他实现)。

它们涵盖 .NET Framework 和 .NET Core。

我想看看是否将 .ToList() 放在 IEnumerable 上 这可能是也可能不是列表,如果 对象已经是一个列表。

它肯定会根据the docs创建一个新列表:

从 IEnumerable 创建列表。

您也可以通过在List&lt;int&gt; 上调用ToList 来自行测试。然后更改新的List&lt;int&gt;原来的List&lt;int&gt; 没有改变——所以它一定是创建了一个新的List&lt;int&gt;

【讨论】:

    【解决方案2】:

    https://source.dot.net/ 是一个很棒的 .dot net (.net core) 源代码在线工具。

    ToList&lt;T&gt;() 的源代码取决于类型。见https://source.dot.net/#q=Linq%20ToList

    【讨论】:

    • 这是一个很棒的工具,感谢您的提醒。
    • 这里是:Enumerable.ToList取决于类型是什么意思?该方法的结果总是一个新的List&lt;T&gt;
    • @mjwills 所有这些ToList 都是.NET Core 的内部方法。只有我链接的那个是公开的。
    • @mjwills 我不明白什么❝源代码取决于类型❞是什么意思。这对我来说是荒谬的。顺便说一句,我也赞成link的答案。
    猜你喜欢
    • 2011-06-15
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2022-01-13
    • 2013-11-02
    • 2011-03-23
    相关资源
    最近更新 更多