场景:我正在跟踪多个性能计数器,并且CounterDescription []与DataSnapshot []相关联...其中CounterDescription [n]描述了DataSnapshot [n]中加载的数据。
我希望在C#中公开一个易于使用的API,以便轻松高效地扩展数组。
简化示例(它变得更复杂)
CounterDescription[0] = Humidity;
DataSnapshot[0] = .9;
CounterDescription[1] = Temp;
DataSnapshot[1] = 63;
请注意我的意图是如何将许多数据快照与DateTime
引用相关联,并使用数据的偏移量来引用其含义。这被认为是在后端存储数据的最有效方式,现在已经反映在以下结构中:
public class myDataObject {
[DataMember]
public SortedDictionary<DateTime, float[]> Pages { get; set; }
/// <summary>
/// An array that identifies what each position in the array is supposed to be
/// </summary>
[DataMember]
public CounterDescription[] Counters { get; set; }
}
如何使用myDataObject?:
我会经常按字符串名称搜索计数器,并使用其'位置来确定将保存特定值的偏移量。我可以使用自行开发的扩展方法来枚举对象,或者在保证订购的情况下利用框架。
此外,我需要在添加新传感器时扩展这些数组中的每一个:(float[]
和CounterDescription[]
),但是已存在的任何数据都必须保持相对偏移量。我不希望此对象的序列化版本将Temp(偏移1)与湿度(偏移0)混淆
哪些.NET对象支持这种固定的排序,扩展和枚举(以及可选的字符串搜索)?我的猜测是使用其中一个对象......
Array[] , LinkedList<t>, and List<t>
答案 0 :(得分:1)
使用Dictionary<string, double>
,以便每个名称(string
)映射到一个值(double
):
var counters = new Dictionary<string, double>();
counters["Humidity"] = 0.9;
counters["Temp"] = 63;
并使用获取和设置计数器值的服务:
[OperationContract]
public double GetCounter(string name)
{
return Counters[name];
}
[OperationContract]
public void SetCounter(string name, double value)
{
Counters[name] = value;
}
您可以以相同的方式使用CounterDescription
和/或DataSnapshot
类,但请确保您用作密钥的类(可能是CounterDescription
)覆盖{{1}和Object.Equals()
正确实施。
答案 1 :(得分:0)
如果CounterDescription
是字符串或enum
,那么Dictionary
似乎很合适:
Dictionary<string, double> Counters = new Dictionary<string, double>();
// Then initialize it ...
Counters.Add("Humidity", 0);
Counters.Add("Temp", 0);
// To update:
Counters["Humidity"] = 0.9;
// To query
double humidity = Counters["Humidity"];
您可以使用enum
为密钥而不是字符串执行相同类型的操作。
如果您的CounterDescription
类型是一个复杂的对象,您仍然可以将其用作键,但您需要实现IComparable
或提供比较功能。
答案 2 :(得分:0)
任何列表(IList)都有订单值。我总是认为仅仅IEnumerables下面没有严格的命令;虽然他们通常这样做,但你无法保证。我同意其他人认为词典(或其他IDictionary)是合适的。