实现这一目标的最佳数据结构是什么? [C#中的嵌套属性]

时间:2011-03-25 17:53:21

标签: c# c++ data-structures

我试图弄清楚如何在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 个答案:

答案 0 :(得分:1)

如果您在c ++中使用#defines,则可能enum应该是您的选择

您可以使用Enum类的GetName方法 http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

另见这里的最后一个例子 http://msdn.microsoft.com/en-us/library/cc138362.aspx

每个枚举值的名称在空格处可以有'_'(“Probe_Temperature”而不是“Probe Temperature”),然后只需要string.replace或者尝试编写扩展方法,这将为您提供正确的标签

编辑: 哎呀,抱歉,我失败了 你使用字符串作为参数(“P33352”),枚举是整数,所以这可能不适合你

答案 1 :(得分:1)

这样的事情可能有所帮助(不知道它是否是最好的,但我会用它)

声明两种类型的类,并像

一样使用它们
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>();

然后像{/ p>一样添加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);
}

答案 2 :(得分:0)

我假设这只是你需要做的事情的片段,探头/机架温度不是静态的,而是存在于数据库中。这是一个可以做你想做的结构:

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格式化我的代码。 :(

答案 3 :(得分:0)

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);

答案 4 :(得分:0)

我猜你可以选择一个通用的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
{

..

}

我认为所有其他答案也很棒。可能你需要更具体地了解你想要实现的目标。