Какой объект коллекции подходит для фиксированного упорядочения значений? - PullRequest
0 голосов
/ 17 января 2011

Сценарий: я отслеживаю несколько счетчиков производительности, и CounterDescription [] соотносится с DataSnapshot [] ... где CounterDescription [n] описывает данные, загруженные в DataSnapshot [n].

Я хочу предоставитьпростой в использовании API в C #, который позволит легко и эффективно расширять массивы.

Упрощенный пример (становится все более сложным)

CounterDescription[0] = Humidity;
DataSnapshot[0] = .9;
CounterDescription[1] = Temp;
DataSnapshot[1] = 63;

Обратите внимание, как мое намерение состоит в корреляциимногие Datasnapshots со ссылкой 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) с Humidity (смещение 0)

Какие объекты .NET поддерживают это фиксированное упорядочение, расширение и перечисление (и необязательный поиск по строке)?Я предполагаю использовать один из этих объектов ...

Array[] , LinkedList<t>, and List<t>

Ответы [ 3 ]

1 голос
/ 17 января 2011

Используйте 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), переопределяет Object.Equals() и Object.GetHashCode() надлежащим образом осуществление.

0 голосов
/ 17 января 2011

Любой список (IList) имеет упорядоченные значения.Я всегда предполагаю, что простые IEnumerables не имеют строгого порядка под ними;хотя они обычно делают, вы не можете гарантировать это.Я согласен с другими в том, что словарь (или какой-то другой IDictionary) хорошо подходит.

0 голосов
/ 17 января 2011

Если 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 или предоставить функцию сравнения.

...