Какова лучшая структура данных для реализации этого?[Вложенные свойства в C #] - PullRequest
0 голосов
/ 25 марта 2011

Я пытаюсь выяснить, как эффективно хранить и организовывать следующие данные в структуре данных в C #.Данные являются настройками, каждый из которых имеет соответствующее имя параметра (строка), метку (строку) и, возможно, другие элементы.

Например, данные в C ++:

//Analog Inputs
#define PROBETEMPERATURE    "P33352"
#define PROBETEMPERATURE2   "P33353"
... 
//Digital Inputs
#define RACKTEMPERATURE1    "P33384"
#define RACKTEMPERATURE2    "P33385"
...

//Analog Input Labels
#define LBLPROBETEMPERATURE     "Probe Temperature"
#define LBLPROBETEMPERATURE2    "Probe Temperature 2"
...
//Digital Input Labels
#define LBLRACKTEMPERATURE1     "Rack Temperature 1"
#define LBLRACKTEMPERATURE1     "Rack Temperature 2"
...

Есть лиспособ эффективно структурировать это, используя вложенные свойства, просто используя const или лучший способ?Например, реализация будет выглядеть так:

AnalogInput.PROBETEMPERATURE.Paramater;
AnalogInput.PROBETEMPERATURE.Label;

DigitalInput.RACKTEMPERATURE1.Paramater;
DigitalInput.RACKTEMPERATURE1.Label;

Я пытаюсь избежать создания статических объектов для каждого из них, так как их много.

Спасибо.

Ответы [ 5 ]

1 голос
/ 25 марта 2011

что-то вроде этого может помочь (не знаю, будет ли это лучше, но я бы использовал это)

объявляет класс обоих типов и использует их как

public class AnalogInput
{
    public string Label { get; set; }
    public string Parameter { get; set; }
}

public class DigitalInput
{
    public string Label { get; set; }
    public string Parameter { get; set; }
}

Вы можете потреблять их как

создать экземпляр

DigitalInput digiIn = new DigitalInput();
digiIn.Label = "This is digital Input";
digiIn.Parameter = "This is digital Parameter"

если вы хотите иметь много значений цифровых входов или аналоговых входов, вы можете объявить List<DigitalInput> digiData = new List<DigitalInput>();

затем добавьте digiIn к нему как

digiData.Add(digiIn);

то же самое можно сделать для аналога

позвольте мне показать вам, как

List <DigitalInput> digiData = new List<DigitalInput>();
    for(int x =0;x<10;x++)
    {
       DigitalInput digiIn = new DigitalInput();
       digiIn.Label = "This is digital Input No "+ x.ToString();
       digiIn.Parameter = "This is digital Parameter No "+ x.ToString();
       digiData.Add(digiIn);
    }

и показать значения, которые вы можете сделать

foreach (DigitalInput dataToDisplay in digiData )
{
MessageBox.Show("Label is :" + dataToDisplay.Label +" and Parameter is " + dataToDisplay.Parameter);
}
1 голос
/ 25 марта 2011

если вы использовали #defines в c ++, то, скорее всего, enum должен быть вашим выбором

Вы можете использовать метод GetName класса Enum http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

Также смотрите последний пример здесь http://msdn.microsoft.com/en-us/library/cc138362.aspx

Имя каждого значения перечисления может иметь '_' в пробеле ("Probe_Tempera" вместо "Probe Temperature"), затем просто string.replace или, возможно, попытаться написать метод расширения, который даст вам правильную метку

Edit: ой, извините, я не смог вы используете строки в качестве параметров ("P33352"), enum является целым числом, так что это, вероятно, не решение для вас

0 голосов
/ 25 марта 2011

Полагаю, вы можете выбрать общий класс Settings, в котором есть переменные экземпляра, такие как параметр и метка. Затем вы можете расширить этот класс для каждого параметра и добавить любые другие параметры.

public class Settings
{
    public readonly string Parameter;
    public readonly string Label;

    public Settings(string parameter, string label)
    {
        Parameter = parameter;
        Label = label;
    }
}

public class ProbeTemperature : Settings
{

..

}

Я думаю, что все остальные ответы тоже великолепны. Возможно, вам нужно быть более конкретным в отношении того, чего именно вы хотите достичь.

0 голосов
/ 25 марта 2011

Perhas что-то вроде этого?

public class Input
{
     public InputType InputType { get; set; }
     public Temperature ProbeTemperature { get; set; }
     public Temperature RackTemperature { get; set; }
}

public class Temperature
{
     public string Parameter { get; set; }
     public string Label { get; set; }
}

public enum InputType
{
     Digital,
     Analog
}

Тогда используйте вот так:

List<Input> inputs = new List<Input>();

Input x = new Input() { InputType = InputType.Digital };
x.RackTemperature = new Temperature { Parameter = "P", Label = "L" };
x.ProbeTemperature = new Temperature { Parameter = "P', Label = "L" };

inputs.Add(x);
0 голосов
/ 25 марта 2011

Я предполагаю, что это просто фрагмент того, что вам нужно сделать, и что температуры зонда / стойки не являются статическими, а находятся в базе данных или что-то в этом роде.Вот структуры, которые будут делать то, что вы хотите:

List<TemperatureInfo> infos = new List<TemperatureInfo>()
{
    new TemperatureInfo("Probe")
    {
    new Temperature("P33352", "Temperature 1"),
    new Temperature("P33353", "Temperature 2"),
    },
    new TemperatureInfo("Rack")
    {
    new Temperature("P33384", "Temperature 1"),
    new Temperature("P33385", "Temperature 2"),
    }
};

public class TemperatureInfo : List<Temperature>
{
    public string Name { get; set; }

    public TemperatureInfo(string name)
    {
    this.Name = name;
    }
}

public class Temperature
{
    public string ID { get; set; }
    public string Label { get; set; }

    public Temperature(string id, string label)
    {
    this.ID = id;
    this.Label = label;
    }
}

PS: Я бы хотел, чтобы SO форматировал мой код правильно.(

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...