什么集合对象适用于固定的值排序?

时间:2011-01-17 19:10:16

标签: c# .net arrays memory-management linked-list

场景:我正在跟踪多个性能计数器,并且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>

3 个答案:

答案 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)是合适的。