gpt4 book ai didi

c# - 在大型数据集的可枚举 LINQ 查询结果上使用 ToList() - 效率问题?

转载 作者:太空狗 更新时间:2023-10-30 00:43:18 24 4
gpt4 key购买 nike

我在目前正在编写的应用程序中大量使用了 LINQ 查询,我一直遇到的情况之一是必须将 LINQ 查询结果转换为列表以供进一步处理(我有我想要列表的原因)。

我想更好地了解此列表转换中发生的情况,以防效率低下,因为我现在已经反复使用它。所以,如果我执行这样的一行:

var matches = (from x in list1 join y in list2 on x equals y select x).ToList();

问题:

  1. 除了创建新列表及其填充并引用从查询返回的 Enumerable 中的元素之外,这里是否有任何开销?

  2. 您会认为这种做法效率低下吗?

  3. 有没有办法让 LINQ 查询直接生成列表,以避免在这种情况下需要进行转换?

最佳答案

好吧,它创建了数据的副本。这可能效率低下——但这取决于发生了什么。如果您需要 List<T>最后,List<T>通常会接近您将获得的效率。一个异常(exception)是,如果您要只是 进行转换并且源已经是一个列表 - 然后使用 ConvertAll会更有效率,因为它可以创建大小合适的支持数组作为开始。

如果您需要流式传输数据 - 例如你只是要做一个foreach在它上面,并采取不影响原始数据源的操作 - 然后调用 ToList绝对是低效率的潜在来源。它将强制整个list1要评估 - 如果这是一个延迟评估的序列(例如“来自随机数生成器的前 1,000,000 个值”)那么这不好。请注意,当您进行连接时,list2一旦您尝试从序列中提取第一个值(无论是否为了填充列表),无论如何都会被评估。

您可能想阅读我的 Edulinq post on ToList 在后台查看发生了什么 - 至少在一种可能的实现中。

关于c# - 在大型数据集的可枚举 LINQ 查询结果上使用 ToList() - 效率问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11636836/

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