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

Mar*_*son 10 c# linq tolist

我在寻找拇指规则调用ToList/ToArray/MemoizeAll(Rx)IEnumerables,为返回的时候不是返回查询本身IEnumerable的东西.

通常我发现最好只返回查询并让调用者决定是否需要列表,但有时它会因为linq的惰性而回来并咬你.

我想收集指南,例如:

调用ToList如果:

  • 你创建新对象(例如在选择中)
  • 您的查询中有副作用

否则,返回查询

Eri*_*ert 24

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

您的问题的答案是:当调用者期望查询时返回查询; 当调用者期望列表时返回一个列表.在设计方法时,确定调用者更可能需要的内容,实现该方法,然后对其进行记录.

在考虑调用者是否需要查询或列表时,请考虑查询和列表之间的差异:

  • 查询始终是最新的.如果对象/数据库/查询所查询的内容会更改其内容,那么如果再次运行查询,查询结果将会更改.列表不会更改其内容,因此列表已过期.如果您的呼叫者需要最新数据,请给他们一个查询.如果他们需要他们可以在闲暇时检查的数据快照,那么给他们一个清单.

  • 查询执行以获得结果可能很昂贵.列表很便宜,无法获得结果.如果调用者可能想要多次询问结果并且希望每次都得到相同的结果,那么给他们一个列表.

  • 构建查询很快.执行查询以构造列表很.列表始终获取查询的所有结果.调用者可能希望进一步限制查询,例如,仅采用前十个元素.如果调用者不想或不需要承担完全迭代整个查询的费用,那么给他们一个查询; 不要代表他们做出决定并给他们一份清单.

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

  • 等等.

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