以下是一般情况:
我从外部设备获取值,我必须存储时间戳。不知怎的,我想以有效的方式存储信息,以便在处理所有内容时让我的生活更轻松。
作为一个简单的解决方案,我创建了一个存储一行的类:
public class X
{
public DateTime timestamp;
public double value1;
public double value2;
}
然后我从这些对象中创建一个List。
您能否展示一种处理此类数据的更好方法?
谢谢!
答案 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。如果您知道需要从某种键或索引直接访问数据,请使用词典。