使用c#存储数据表以外的表格数据

本文关键字:表格 数据 存储 数据表 使用 | 更新日期: 2023-09-27 18:10:36

我在c#中有一些表格数据,大约有100 K(100000)记录,我必须存储在内存中。什么是最好的方式来存储这些数据,而不是在表格式记住,我有过滤掉的结果,这是基于一些条件(如dt。select("field1=1 and…"),将结果集像SQL表一样排序。

请建议任何其他方法来检索数据。字典是另一种方法,但基于字段条件如何检索数据,如果使用字典或任何其他集合。

使用c#存储数据表以外的表格数据

假设您追求速度和低内存消耗,请尝试以下操作:

  1. 创建一个包含每个属性的模型类列。这是你的实体
  2. 从源表中读取(如果它来自数据库,使用DataReader)。逐条记录读取数据,并为每条记录创建一个实体。在读取字符串类型的每个字段时,你可以稍微优化一下:
    • 优化速度:读取字符串并将其直接放入实体的属性中。
    • 优化内存:读取字符串,对其使用String.Intern并将其放入属性中。
  3. 将所有这些实体存储在集合中。你有两种选择:
    • 使用List<Entity>来存储所有内容。可以对列表和实体使用LINQ来查询集合。这在性能上是相当慢的,但是对于内存来说是最好的解决方案。
    • 如果你事先知道你要使用哪些查询/标准,那么对一组标准使用一个字典。为例。如果你有属性"FirstName"answers"LastName",制作一个字典,它将存储你的实体作为一个值和一个Tuple<string, string>,其中FirstName和LastName的值。现在查询这些值的速度非常快。对于排序,使用SortedDictionary。如果一个键有重复项,创建一个像这样的字典:Dictionary<Tuple<string, string>, List<Entity>>,它将存储所有具有相同匹配的姓和名的记录。我知道这个解决方案需要更多的编码,但相当快。

当然可以保留DataTable溶液。如果内存是你唯一关心的,试着做一个DataReader包装器,它将Intern所有的字符串。将您的包装器环绕原来的DataReader,并用它来创建/填充DataTable