【发布时间】:2009-03-02 08:44:19
【问题描述】:
谁能给我任何资源的指针,详细说明.NET DataSet 类的“底层”使用的结构和算法?
我目前使用的语言没有实现像 DataSet 类这样的通用内存数据结构。我可能最终不得不自己构建一个(但没有那么广泛!),但我想在开始破解之前更好地了解现有系统是如何组合在一起的。 (谢谢Douglas Hofstadter)
我正在阅读Mono implementation,但任何其他链接、文章或想法将不胜感激。
【问题讨论】:
谁能给我任何资源的指针,详细说明.NET DataSet 类的“底层”使用的结构和算法?
我目前使用的语言没有实现像 DataSet 类这样的通用内存数据结构。我可能最终不得不自己构建一个(但没有那么广泛!),但我想在开始破解之前更好地了解现有系统是如何组合在一起的。 (谢谢Douglas Hofstadter)
我正在阅读Mono implementation,但任何其他链接、文章或想法将不胜感激。
【问题讨论】:
启动 Reflector 并直奔源头...
【讨论】:
您可以合法地download the original source code for DataSet from Microsoft,这将使您可以访问所有内容,包括原始 cmets。但是,如果您正在实施类似的系统/产品,则应仔细研究the license,以确保您不太可能通过查看源代码来违反它。
【讨论】:
Reflector 可在http://www.red-gate.com/products/reflector/index.htm 获得,它可以让您准确了解 DataSet 是如何实现的。
您还需要查看 DataAdapter,尤其是 DbDataAdapter.Fill、DataTable,尤其是 DataTable.Load,以及 DataRow 和 DbDataReader。然后,您可能想查看一些特定的实现,例如 SqlDataAdapter、SqlCommand 等。
请注意,DataSet 证明了一切看起来都像钉子的古老格言。它在 .NET 中被过度使用。特别是,不要使用它在 Web 服务和它的客户端之间传输数据 - 它不能很好地互操作。
【讨论】:
ADO.Net 数据集的关键数据结构是Red-Black tree
它很复杂,但有很好的最坏情况 其操作的运行时间,并且是 在实践中高效:它可以搜索, 在 O(log n) 时间内插入和删除, 其中 n 是元素的总数 那个树。简单来说就是红黑 树是二叉搜索树 智能地插入和删除,以 确保树是合理的 平衡。
【讨论】:
名为 Programming ADO.Net 2.0 core reference 的书对数据集进行了出色的描述,包括讨论的许多问题和内部数据结构。
数据集的主要实现依赖于红/黑自平衡树。
本书提到的另一个重要警告是,通过字符串查找数据代码的效率不高,因为它使用字符串比较来搜索查找表以查找适当的列。通过对行数进行硬编码,您可以在表和列上获得相当不错的查找性能提升。当然,这是维护的噩梦,除非你编写一个工具来为你做这件事。
【讨论】: