在简单集合和列表中获取和设置值 - C#

时间:2018-05-15 18:33:49

标签: c# list class collections

我在桌面应用程序上工作了一段时间后离开了应用程序开发世界,我正在使用我的C#而不是使用VB。是现代化的时候了,所以请原谅我在答案中缺乏概念知识。在最后一天冲浪SOF,并发现你不能像我们在VB6中那样使用全局变量数组。它指定使用列表。目标是创建一个类列表,并添加/更新值。

我做了一些搜索,并找到了一些很好的例子,并且已经走得很远,但是我开始关注黄色灯泡的方式太多了。现在我准卡住了。不是说我没有得到它,但我需要知道如何在列表中引用特定值。

例如:

public class WSettings
{
    public string SettingName { get; set; }
    public string SettingVal { get; set; }

    public static void Main()
    {
       List<WSettings> wSettings = new List<WSettings>();
       wSettings.Add(new WSettings { SettingName = "Port", SettingVal = "8080" });
       wSettings.Add(new WSettings { SettingName = "UpdateInterval", SettingVal = "60" });
       wSettings.Add(new WSettings { SettingName = "Baud", SettingVal = "9600" });
       wSettings.Add(new WSettings { SettingName = "bits", SettingVal = "8" });
       wSettings.Add(new WSettings { SettingName = "stopbits", SettingVal = "1" });
       wSettings.Add(new WSettings { SettingName = "parity", SettingVal = "no" });
        }

 }
我开始在这里。但是说我想更新&#34; Port&#34;为了#34; 8181&#34;,我需要创建一个快速功能来完成它,所以我可以从应用程序的不同部分调用它。

public string GetSettingValByName()
{
    return wSetting.SettingName("Port").SettingValue;
}

public void SetValueByName(string settingvalue, string SettingName)
{
    wSetting.Settingvalue("Port") = settingvalue;
}

问题是我在这些示例中如何通过Settingval引用SettingName?我发布的代码我知道不起作用,但我猜这是接近应该怎么做。我正在寻找有关如何使用字符串&#34; Port&#34;进行查询的具体代码,例如.. GetValueByName("Port")返回&#34; 8080&#34;的SettingVal。或者设置&#34; Port&#34;的值。

接下来的问题,我正在读一些关于某个类是否具体成为列表,然后将其作为列表...或集合,例如..

public class AppName1: List<Wsettings>

如果是这种情况,是否有人有一个非常具体的例子,我可以跟随它来构建我正在寻找的东西?

全部谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用Dictionary通过键(SettingName)查找值。但是,我不认为这是最好的方法。您可能不希望通过魔术字符串引用所有设置。此外,通过将整数值存储为整数而不是字符串,您将受益。布尔值应存储为布尔值等。

我会在Main所在的单独文件中创建一个新类。

CommunicationSettings.cs

namespace MyNameSpace
{
    class CommunicationSettings
    {
      public int Port;
      public int UpdateInterval;      
      public int BaudRate;      
      public int Bits;      
      public int StopBits;      
      public bool Parity;
    }
}

在ProgramName.cs

namespace MyNameSpace
{
    class Program
    {
       static void Main()
       {
         CommunicationSettings communicationSettings = new CommunicationSettings();
         communicationSettings.Port = 8081;
         //repeat for all settings
       }
    }
}

您还可以按如下方式封装值:

class CommunicationSettings
{
  private int port;
  private int updateInterval;
  private int baudRate;
  private int bits;
  private int stopBits;
  private bool parity;

  public int Port { get { return port; } set { port = value; } }
  public int UpdateInterval { get { return updateInterval; } set { updateInterval = value; } }
  public int BaudRate { get { return baudRate; } set { baudRate = value; } }
  public int Bits { get { return bits; } set { bits = value; } }
  public int StopBits { get { return stopBits; } set { stopBits = value; } }
  public bool Parity { get { return parity; } set { parity = value; } }
}

要在应用程序的其他部分使用它,您需要将该类的实例传递给使用它的其他类。

如果您的应用程序中只有这些设置的副本,请考虑使用单一模式,如下所示

class CommunicationSettings
{
  private int port;
  private int updateInterval;
  private int baudRate;
  private int bits;
  private int stopBits;
  private bool parity;

  public int Port { get { return port; } set { port = value; } }
  public int UpdateInterval { get { return updateInterval; } set { updateInterval = value; } }
  public int BaudRate { get { return baudRate; } set { baudRate = value; } }
  public int Bits { get { return bits; } set { bits = value; } }
  public int StopBits { get { return stopBits; } set { stopBits = value; } }
  public bool Parity { get { return parity; } set { parity = value; } }


  static CommunicationSettings _TheSettings = null;

  public static CommunicationSettings TheSettings
  {
    get
    {
      if (_TheSettings == null)
      {
        _TheSettings = new CommunicationSettings();
      }
      return _TheSettings;
    }
  }
}

现在你可以在代码的其他部分使用它。

CommunicationSettings settings = CommunicationSettings.TheSettings;
settings.Port = 8081;

答案 1 :(得分:1)

看起来你正在处理键/值对。对于这种类型的数据,请考虑使用Dictionary,因为它已经具有您正在寻找的许多功能。

class Program
{
    static Dictionary<string, string> settings = new Dictionary<string, string>();

    static void Main()
    {
        settings["Port"] = "8080";
        settings["UpdateInterval"] = "60";
        settings["Baud"] = "9600";
        settings["bits"] = "8";
        settings["stopbits"] = "1";
        settings["parity"] = "no";

        // Update a setting
        settings["Port"] = "8081";
    }
}

答案 2 :(得分:1)

SetPort将如下所示(假设只有一个名称为“Port”的设置:

public void SetPort(string value)
        {
            wSettings.Single(x=>x.SettingName=="Port").SettingVal = value;
        }

此外,如果您正在处理密钥唯一的密钥值对,请考虑使用Dictionary 与list相比,它更快。