2012-09-09 27 views
2

我已经为我构建的集合实现了IEnumerable,并且(虽然我没有对它们进行全部测试),但Seq值似乎能够正常工作。当我的集合的本地性能比使用Seq的基于IEnumerable的函数更好时,是否可以重写某些Seq值,例如“last”?我没有找到任何有关压倒Seq的信息。是否可以重写Collections.Seq模块中的值?

回答

2

否 - Seq模块中的功能不能被覆盖。但是,其中一些尝试通过检查输入值(通过它们的seq<'T>实例)来优化性能,以查看它是否为IList<'T>'T[]的实例;如果是的话,这些函数将采取一些优化的代码路径。例如,如果将一个数组('T[])传递给Seq.length,它将能够通过使用数组的.Length属性快速确定长度。

如果您被困在使用Seq模块,我能想到的唯一性能优化将使您的集合也实现ICollection<'T>和/或IList<'T>。这可能会优化一些情况,但它不会是全部个案。

+0

感谢您的详细解答。我想答案是“不”,但值得一提的是我忽略了一些事情。 –

2

正如在其他答案中已经说过的那样,您无法覆盖Seq模块中的功能。如果您正在实施自定义集合,那么最好的做法是遵循核心F#库使用的标准模式。

  • Seq模块包含可合理地规定的任何序列中最经常使用的功能和功能。

  • 模块等ArrayList提供用于特定集合类型更有效的实现和它们添加更多的功能(在Seq不可用),其特定于集合(例如,函数和List.tailArray.get)。

将自己的收藏时,最好的办法是遵循这个模式:

  • 实现IEnumerable<'T>使从Seq模块的工作职能为你的类型

  • 创建MyCollection模块包含标准功能的高效实现(至少那些对您很重要的功能)并添加更多针对您的收藏集的功能。

相关问题