【问题标题】:Variables in a loop循环中的变量
【发布时间】:2025-12-02 23:15:01
【问题描述】:

我想知道“for”循环中是否有一种方法可以为根据其索引号命名的字符串变量赋值?

假设我有 3 个名为的字符串变量:

string message1 = null;
string message2 = null; 
string message3 = null;

我希望“for”循环执行以下代码:

 for (int i = 1; i <=3; i++)
 {
   messagei = "blabla" + i.ToString();
 }

我不想使用“if”或“switch”,因为这会使代码更难理解。

有没有办法做到这一点?

【问题讨论】:

  • 是的,这是可能的。你称它为数组。
  • messagei 是未声明变量的名称。 C# 中没有动态变量名。
  • 你有很多替代品来实现这一目标。但问题(对您而言)是,您的业务需要什么?在您的情况下,为每个变量提供适当的名称并通过读取相应的索引将适当的值存储在该变量中可能是完美的。简单的代码应该优先于使用花哨的 API(例如反射)

标签: c# for-loop


【解决方案1】:

您不想要 3 个具有相同名称的变量,您想要这些变量的数组。

string[] messages = new string[3]; // 3 item array

然后您可以将您的项目存储在数组元素中

messages[0] = "Apple"; // array index starts at 0!
messages[1] = "Banana";
messages[2] = "Cherry"; 

创建该数组的另一种方法是内联数组初始化器,节省一些代码

string[] messages = { "Apple", "Banana", "Cherry" }; 

(注意:数组初始化有更多有效的语法。对各种其他方法的研究留作练习。)

并通过循环访问它们(foreach)

foreach (string fruit in messages)
{
    Console.WriteLine("I'm eating a " + fruit);
}

或者对于

for (int i = 0; i < messages.Length; i++)
{
    Console.WriteLine("I'm eating a " + messages[i]); // reading the value
    messages[i] = "blabla" + i.ToString(); // writing a value to the array
}

【讨论】:

  • 然后当然使用messages[i] = "blabla" + i.ToString(); +1 表示正确的方向
【解决方案2】:

你不能这样做(好吧,不是很清醒)。您是否考虑过使用字符串数组来代替?

【讨论】:

    【解决方案3】:

    我认为你应该为这种变量使用数组。

    string[] message = new string[3];
    for (int i = 1; i <=3; i++)
    {
         message[i] = "blabla" + i.ToString();
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用数组吗?还是列表类型?

      string[] messages = new string[3];
      for (int i = 1; i <=3; i++)
       {
         messages[i] = "blabla" + i.ToString();
       }
      

      【讨论】:

        【解决方案5】:

        通常不是将 N 个不同的变量命名为 1、2、...、N,而是将它们存储在一个数组中:

        string message[3];
        message[0] = null;
        message[1] = null;
        message[2] = null; 
        

        然后是循环:

        for (int i = 0; i <=2; i++)  
        {  
           message[i] = "blabla" + i.ToString();  
        }  
        

        请注意,一组索引变量通常以值 0 开始;)

        【讨论】:

          【解决方案6】:

          我会做一些不同的事情,也许使用字典并存储您的消息。像这样的:

           Dictionary<string, string> messages = new Dictionary<string, string>();
           for(int i = 1; i <= 3; i++)
           {
                messages.Add("message" + i.ToString(), i.ToString());
           }
          

          【讨论】:

            【解决方案7】:

            你也可以不使用索引:

                string[] Messages = { "Tom", "Dick", "Harry" };
            
                foreach (String Message in Messages)
                {
                    Response.Write("Hello " + Message + "<br />");
                }
            

            【讨论】:

              【解决方案8】:

              你说你不想有一个 switch 语句。我意识到这确实有一个开关,但如果你必须有三个不同的变量,你可以将你的开关封装在一个函数调用中:

              string message1 = null;
              string message2 = null; 
              string message3 = null;
              
              void SetMessage(int i, string value)
              {
                  if(i == 1)
                      message1 = value;
                  etc
              }
              
               for (int i = 1; i <=3; i++)
               {
                 SetMessage(i, "blabla" + i.ToString());
               }
              

              不是最佳解决方案,但如果您必须有单独的变量,它将隐藏混乱。

              【讨论】:

                【解决方案9】:

                如果你在一个类中声明你的变量为公共变量,你可以按如下方式访问它们;

                public partial class _Default : System.Web.UI.Page
                {
                    public string message1 = null;
                    public string message2 = null; 
                    public string message3 = null;
                
                
                    public void setVars()
                    {
                        for (int i = 1; i <=3; i++)
                         {
                             this.GetType().GetField("message" + i.ToString()).SetValue(this, "blabla" + i.ToString());
                
                         }
                    }
                
                
                
                
                }
                

                【讨论】: