如何在C#中存储表 - 我应该使用什么样的数据结构?

时间:2009-07-28 09:13:27

标签: c# data-structures

以下是一般情况:

我从外部设备获取值,我必须存储时间戳。不知怎的,我想以有效的方式存储信息,以便在处理所有内容时让我的生活更轻松。

作为一个简单的解决方案,我创建了一个存储一行的类:

public class X 
{
  public DateTime timestamp;
  public double value1;
  public double value2;
}

然后我从这些对象中创建一个List。

您能否展示一种处理此类数据的更好方法?

谢谢!

4 个答案:

答案 0 :(得分:5)

这对我来说似乎是完全合理的,虽然我使用属性而不是公共字段。如果从外部设备获取值,则可能需要考虑使类型为immutable - 将所有值传递给构造函数并将它们存储在只读字段中。当类型不可变时,我发现更容易推理我的代码:)

您关注什么样的效率?你有多少这些价值观?即使这里没有很多值,我可能仍然使用类而不是结构...我很少创建自己的结构。再一次,我只是发现类更容易推理(例如,不需要担心拳击。)此外,这感觉就像“一组值”而不是一个不可分割的值,这是结构通常用于(数字等) 。它只是感觉就像我的结构。

每个对象会产生一个开销,但除非你有充分的理由,否则我不会担心。

编辑:这似乎是一个微不足道的要点,但给出一切有意义的名字。例如:

public class DeviceReading
{
    private readonly DateTime timeStamp;
    public DateTime TimeStamp { get { return timeStamp; } }

    private readonly double temperature;
    public double Temperature { get { return temperature; } }

    private readonly double airPressure;
    public double AirPressure { get { return airPressure; } }

    public DeviceReading (DateTime timeStamp,
                          double temperature,
                          double airPressure)
    {
        this.timeStamp = timeStamp;
        this.temperature = temperature;
        this.airPressure = airPressure;
    }
}

我怀疑你无论如何都会这样做,但我只是认为我会确定:)

还需要考虑其他一些事项:

  • 假设您使用的是最新版本的.NET,您可能希望使用DateTimeOffset而不是DateTime。好处是DateTiemOffset明确地表示即时,而DateTime可以是UTC,本地或未指定。

  • 根据您正在阅读的阅读类型(以及他们的沟通方式),您可能希望使用decimal代替double。可能不是温度和气压(或任何其他“物理”值),但如果你正在处理人工价值,如钱,decimal是你的朋友。鉴于这是从设备读取的,你可能可能处理物理量,但我认为值得一提。

  • 为了处理读数集合,真的想要查看LINQ。这很可爱:)

答案 1 :(得分:0)

这种类型足够小,假设它是不可变的,你可能会考虑使用结构。这将减少垃圾收集堆的负载。

您到底想要优化什么?内存占用?阅读表现?你将如何阅读数据?

答案 2 :(得分:0)

如果您计划在数组中放置许多X个对象,我建议将其设为struct,因为它只包含一些“普通旧数据”项(无对象)。除此之外,它似乎是一种处理数据的直接方式。

答案 3 :(得分:0)

你已经这样做的方式没有什么特别的错误。 (尽管正如其他人所建议的那样,您应该将您的字段设为私有并改为使用公共属性)

决定使用哪种存储结构的最佳方法通常是考虑如何使用数据。

例如,如果您知道需要以某种顺序处理数据,请考虑使用SortedList。如果您知道需要从某种键或索引直接访问数据,请使用词典。