【问题标题】:How can I create a simple class that is similar to a datatable, but without the overhead?如何创建一个类似于数据表但没有开销的简单类?
【发布时间】:2023-03-26 08:35:01
【问题描述】:

我想创建一个类似于数据表的简单类,但没有开销。

所以用 sqldatareader 加载对象,然后返回这个自定义的类似数据表的对象,它可以让我访问如下行和列:

myObject[rowID]["columnname"]

您将如何创建这样的对象?

我不想要这个对象的任何内置方法/行为,除了访问数据的行和列。

更新:

我不想要数据,我想要更精简的东西(另外我想学习如何创建这样的对象)。

【问题讨论】:

  • 数据表不是“对象中的数据库”。它只是从查询中提取的数据的 xml 表示,您可以使用一些其他方法来操作该 xml。记录集是相同的东西(在后台使用 Xml)。
  • 您所说的“有效负载”是代码部分的一部分,而不是数据。无论您是否使用它,它都会与 .Net 框架的其余部分一起加载一次。即使您根本不使用数据表,您也必须为此付出代价。
  • 换一种说法:那部分只是算法,用代码表示。 代码 如果你不使用它,加载起来很便宜。对于 CLR 库,您别无选择。始终加载整个 CLR。​​
  • -1 因为这个问题非常含糊不清。
  • @Jole Coehoorn:DataTable 不是任何东西的 XML 表示。除此之外,我同意你关于开销的看法。最好这样问这个问题:“由于 X,DataTables 对我来说太重了。我的替代方案是什么?”

标签: c# .net ado.net datatable


【解决方案1】:

这种类型的结构可以通过以下类型签名轻松创建:

List<Dictionary<string, object>>

这将允许您指定的访问,并且应该很容易填充。

您始终可以创建一个继承自 List > 的对象,并实现一个采用 SqlDataReader 的构造函数。这个构造函数应该为每一行创建一个 enw 字典,并为每一列插入一个新条目到字典中,使用列名作为键。

【讨论】:

  • 你知道字典的默认大小写吗?
  • 这不是 lightwait,因为每行都会创建一个 Dictionary 实例。
【解决方案2】:

我认为您对 .Net 的工作方式有所了解。 DataTable 中涉及的额外开销并不重要。您能否指出您认为由数据表引起的现有代码中的特定性能问题?也许我们可以用更优雅的方式帮助纠正这个问题。

【讨论】:

  • 据我了解,数据表是对象中的数据库,因此显然必须带来一些我不需要的开销。自定义实现看起来很简单,为什么不呢?
  • 否:数据表不是对象中的整个数据库。
  • 它确实将整个查询结果一次拉入内存。如果这就是您的问题所在,那么您想要的是 DataReader。 DataReader 一次只会将一行加载到内存中,而且速度非常快。
  • 一个数据表或数据集有很多内置功能,因此对象的有效负载将远远超过我想要的简化版本。即您可以在数据表上执行 SELECTS、连接、拥有主键等。
  • 您所说的“有效负载”隐藏在代码部分中,并作为 .Net 框架的一部分加载。无论您是否选择使用数据表,都必须为此付出代价。
【解决方案3】:

也许您要问的具体问题是如何在您自己的表对象中使用方便的["whatever"] 索引语法。

如果是这样,我建议你参考索引器上的this MSDN page。

【讨论】:

    【解决方案4】:

    Dictionary&lt;int,object[]&gt; 会比List&lt;Dictionary&lt;string, object&gt;&gt; 更好。您实际上并不需要每一行的字典,因为所有行的列名都是相同的。如果你想让它轻量级,你应该使用列索引而不是名称。

    因此,如果您有一列“名称”是第 3 列,要从行 ID 10 中获取其值“名称”,代码将是:

    object val = table[10][2];
    

    另一个选项是SortedList&lt;int,object[]&gt;...,具体取决于您访问数据的方式(仅转发或随机访问)。

    您也可以使用PowerCollections 中的MultiDictionary&lt;int,object&gt;。

    从内存使用的角度来看,我认为最好的选择是使用具有一些松弛容量的单维数组。因此,在每行之后,比如 100 行,您将创建一个新数组,将旧内容复制到其中并在最后留下 100 个空行。但是当您删除一行时,您必须保留某种索引,以便在不调整数组大小的情况下将其标记为已删除。

    【讨论】:

      【解决方案5】:

      这不是 DataSet/DataTable 吗?也许我没有得到这个问题。 还有,编程语言是什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 2019-06-22
        相关资源
        最近更新 更多