【问题标题】:Assigning values to C# string array based on parameter根据参数为 C# 字符串数组赋值
【发布时间】:2011-12-08 22:49:45
【问题描述】:

在 C# 中,我有一个值的字符串数组。但是,基于参数,数组不应包含两个值,而应包含所有相同的其他值。解决这个问题的正确方法是什么? (我可以使用列表...但我希望有更好的方法)

示例代码:

bool msettingvalue=false;
string[] settings;
if(msettingvalue)
    settings = new string[]{
        "setting1","1",
        "setting2","apple",
        "msetting","true"};
else
    settings = new string[]{
        "setting1","1",
        "setting2","apple"};
//code that goes through settings

将数组分配给设置的正确方法是什么。所有的值都是一样的,如果 msettingvalue 为 false,它应该包括某些设置。 (如果您想到更好的标题,可以更改标题)。

编辑1 理想情况下,我希望使用 string[] 数组而不是字典,因为它更快……而且我正在按顺序遍历数组,所以我不需要键索引。

编辑2 我问了一个followup 的问题,希望有办法为此使用内联条件。

【问题讨论】:

  • 看我的回答,我刚刚编辑过,也许你会没问题

标签: c# arrays


【解决方案1】:

你可以用这样的东西:

Dictionary<string,string> settings = new Dictionary<string,string>();
if (msettingValue) {
   settings["msetting"] = "true";
}
settings["setting1"] = "1";
settings["setting2"] = "apple";

【讨论】:

    【解决方案2】:

    如果你真的不想使用字典,你可以使用这个功能:

        private static string[] AddSettings(ref string[] settings, params string[] SettingsToAdd)
        {                   
            int length = SettingsToAdd.Length;
    
            if (length%2 !=0)
            {
                throw new ArgumentException("Invalid number of elements");
            }
    
            int OldLength = settings.Length;
            int NewLength = settings.Length + length;
            Array.Resize(ref settings, NewLength);
            for (int i = OldLength; i < NewLength; i++)
            {
                settings[i] = SettingsToAdd[i - OldLength];
            }
            return settings;
        }
    

    编辑:或者这个版本,基于你其他帖子的回答:

        private static string[] AddSettings(ref string[] settings, params string[] SettingsToAdd)
        {                   
            int length = SettingsToAdd.Length;
    
            if (length%2 !=0)
            {
                throw new ArgumentException("Invalid number of elements");
            }
            else
                return settings.Concat(SettingsToAdd).ToArray();
        }
    

    及其用途:

            bool msettingvalue = true;
            string[] settings;
            settings = new string[]{
                "setting1","1",
                "setting2","apple"};
            if (msettingvalue)
            {
                settings= AddSettings(ref settings,"setting1", "value1", "setting2", "value2", "setting3", "value3");
            }
    

    然后你可以添加任意数量的值,并且计数必须是 2 的倍数,如果不是,它会抛出异常

    【讨论】:

    • Array.Resize 将整个数组复制到具有该大小的新数组(因此很慢)...使用字典会更快。
    【解决方案3】:

    为什么不用公共元素构建数组,然后如果 bool 设置变量为 true,则添加额外的东西?

    【讨论】:

      【解决方案4】:

      我强烈认为您应该改用Dictionary&lt;string, string&gt;

      那么你可以:

      bool msettingValue = false;
      Dictionary<string, string> settings = new Dictionary<string, string> {
          {"setting1", "1"},
          {"setting2", "apple"},
      }
      if(msettingValue) {
          settings.Add("msetting", "true");
      }
      

      【讨论】:

      • 我知道我可以使用字典/列表...但我想看看是否有任何字符串 [] 数组...它更快。
      • @user389823:你说它更快,但你最终添加的所有机制来模仿字典(因为它就是这样)将消耗 CPU 时间。
      • @user389823,这就是所谓的“过早优化”(一种很难改掉的坏习惯)。更便宜的是:更多的CPU;还是更多的开发时间?
      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 2016-05-12
      • 2021-09-11
      • 1970-01-01
      • 2020-07-31
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多