gpt4 book ai didi

c# - 返回 LINQ 结果时何时调用 ToList 的经验法则

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

我正在寻找在 IEnumerables 上调用 ToList/ToArray/MemoizeAll(Rx) 的经验法则,而不是在返回 时返回查询本身IEnumerable 的东西。

我经常发现最好只返回查询并让调用者决定是否需要列表,但有时由于 linq 的懒惰特性,它可能会回来咬你一口。

我想收集指南,例如:

Call ToList if:

  • you create new objects (eg. in a select)
  • you have side effects in your query

Otherwise, return the query

最佳答案

首先,您永远不应该在查询中产生副作用。这是最糟糕的做法。查询应该回答问题,而不是产生效果。

你的问题的答案是:当调用者期望查询时返回一个查询;当调用者需要一个列表时返回一个列表。当您设计您的方法时,确定调用者更可能想要什么,实现它,然后记录它。

在考虑调用者想要查询还是列表时,请考虑查询和列表之间的区别:

  • 查询始终是最新的。如果查询查询的对象/数据库/任何内容更改了其内容,那么如果您再次运行查询,查询结果将会更改。列表不会更改其内容,因此列表会过时。如果您的来电者需要最新数据,请向他们询问。如果他们需要他们可以在闲暇时检查的数据快照,请给他们一个列表。

  • 执行查询以获得结果的成本可能很高。列表很容易获得它们的结果。如果调用者可能想要多次查询结果并期望每次都得到相同的结果,那么给他们一个列表。

  • 构建查询很快。执行查询以构建列表很慢。列表总是获得查询的所有结果。调用者可能想进一步限制查询,例如,只取前十个元素。如果调用者不想或不需要承担完全迭代整个查询的费用,那么给他们一个查询;不要代表他们做出决定并给他们一份 list 。

  • 查询很小。列表很大。许多查询可以在 O(1) 空间中迭代 n 个项目;包含 n 项的列表占用 O(n) 空间。如果结果集很大,那么将其放入列表中可能效率低下。

  • 等等。

没有简单的答案。答案与任何其他设计问题的答案相同:在功能用户最可能想要的内容的背景下考虑每个可能解决方案的所有优缺点,然后选择一个合理的折衷解决方案.

关于c# - 返回 LINQ 结果时何时调用 ToList 的经验法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3371834/

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