DataTable的替代数据结构

时间:2012-02-17 12:24:11

标签: c# data-structures datatable

我需要某种数据结构来执行以下操作:

一个“set”由许多类型组成,如string,integer,datetime和double。 动态添加了许多集合 在提取信息的情况下动态检索集合

现在显而易见的解决方案是使用DataTable。定义数据表结构,并在每次需要添加新集时添加新行。需要时从数据表中提取数据。

实际上我已经使用数据表实现了它,但问题是由于某种原因它非常慢。由于这样做成千上万次,性能可能会有问题。

是否存在可以使用的具有更好性能的替代数据表类型的数据结构,或者我应该使用Lists<>构建我自己的类?

3 个答案:

答案 0 :(得分:6)

根据您的使用情况,我建议您使用List<object[]>(因为您提到了动态架构)作为中央数据结构,但如果以后需要,您需要自己维护架构信息。

如果您需要将UI绑定到数据,这种方法将增加许多额外的手动工作,它更适合于大量数据的后台处理。

我们过去曾使用过这种方法,与数据表相比,批量处理数据时可以节省2/3的内存和80%的执行时间。

答案 1 :(得分:2)

解决此类问题的另一种方法是:在内存中使用sqlite数据库。

一开始听起来很奇怪,但是你可以将非常复杂的结构放到表中,并且你可以获得SQL的全部功能来处理你的数据。 SQLite是一个很小的库,因此它不会让您的代码膨胀。将数据库集成到您的代码中起初可能有点奇怪,性能应该适用于大型数据集(因为这就是为数据库制作的)。如果您需要将该数据保存到磁盘,那么您已经完成了。

根据您的问题的细节,移动到更大的数据库后端(例如postgres)甚至可能是一个好主意,但这很难说。只是不要轻易放弃这个想法。

答案 2 :(得分:0)

关于stackoverflow有几个类似的问题,但没有一个提供了很好的答案。通用替代方法不应为List<YourObject>,因为YourObject不是通用的。 DataTable的优点在于它没有数据模型。

DataTable是行的集合,而每一行是单元格的集合。单元格可以是字符串或数字。因此我们可以将Cell定义为:

public class Cell
    {
        public double Value { get; set; }
        public string Text { get; set; }
    }

然后一行将是Dictionary<string, Cell>,其中string是列名。然后,DataTable替代品只是List<Dictionary<string, Cell>>

假设您将“行”定义为public List<Dictionary<string, Cell>> Rows;

现在,您可以轻松查询以下行:

var MaleHeight = Rows.Where(row => row["sex"].Text == "Male").Select(row => row["Height"].Value);