gpt4 book ai didi

c# - Linq 中的 ToList 方法

转载 作者:可可西里 更新时间:2023-11-01 08:07:33 25 4
gpt4 key购买 nike

如果我没记错的话,ToList() 方法会迭代所提供集合的每个元素并将它们添加到 List 的新实例并返回此实例。假设一个示例

//using linq
list = Students.Where(s => s.Name == "ABC").ToList();

//traditional way
foreach (var student in Students)
{
if (student.Name == "ABC")
list.Add(student);
}

我认为传统方式更快,因为它只循环一次,而上面的 Linq 为 Where 方法迭代两次,然后为 ToList() 方法迭代两次。

我现在正在从事的项目广泛使用了列表,我看到有很多这样的 ToList() 和其他方法,如果我采用 list<,可以像上面那样做得更好/strong> 变量作为 IEnumerable 并删除 .ToList() 并将其进一步用作 IEnumerable。

这些东西对性能有影响吗?

最佳答案

Do these things make any impact on performance?

这取决于您的代码。大多数时候,使用 LINQ 确实会对性能造成很小的影响。在某些情况下,这种命中对您来说可能很重要,但只有当您知道 LINQ 对您来说太慢时才应避免使用 LINQ(即,如果分析您的代码表明 LINQ 是您的代码缓慢的原因)。

但是您是对的,过于频繁地使用 ToList() 会导致严重的性能问题。您应该仅在必须时才调用 ToList()。请注意,在某些情况下,添加 ToList() 可以大大提高性能(例如,每次迭代时都从数据库加载集合)。

关于迭代次数:这取决于你所说的“迭代两次”到底是什么意思。如果您计算在某些集合上调用 MoveNext() 的次数,那么是的,以这种方式使用 Where() 会导致迭代两次。操作顺序如下(为简化起见,我假设所有项目都符合条件):

  1. Where() 被调用,暂时没有迭代,Where() 返回一个特殊的可枚举。
  2. ToList() 被调用,对从 Where() 返回的枚举对象调用 MoveNext()
  3. Where() 现在对原始集合调用 MoveNext() 并获取值。
  4. Where() 调用您的谓词,它返回 true
  5. MoveNext()ToList() 调用返回,ToList() 获取值并将其添加到列表中。

这意味着如果原始集合中的所有 n 项都符合条件,MoveNext() 将被调用 2n 次,Where() 中的 n 次和 ToList() 中的 n 次。

关于c# - Linq 中的 ToList 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com