【问题标题】:Strings not being replaced during loop循环期间未替换字符串
【发布时间】:2013-02-25 12:15:04
【问题描述】:

我正在为 skype bot 做一个消息循环,这意味着我可以轻松地做广告/群发消息。但是,在循环中的第一个名称字符串被类中的名称替换后,它将仅使用该名称,而不会在下一个循环中替换新名称。

代码:

if(listView2.SelectedItems.Count<=0)
    return;

string value="Hi %name%!";
string body="";

if(Program.InputBox("New Message", "Body of the message:", ref value)==DialogResult.OK) {
    body=value;
}

foreach(ListViewItem i in listView2.SelectedItems) {
    String rawID=i.SubItems[7].ToString();
    String[] splitID=rawID.Split('}');
    String[] ID=splitID[0].Split(new char[] { '{' });

    body=body.Replace("%handle%", SkypeUser.Users[Convert.ToInt32(ID[1])].Handle);
    body=body.Replace("%name%", SkypeUser.Users[Convert.ToInt32(ID[1])].Name);
    body=body.Replace("%status%", SkypeUser.Users[Convert.ToInt32(ID[1])].Status);
    body=body.Replace("%country%", SkypeUser.Users[Convert.ToInt32(ID[1])].Country);
    body=body.Replace("%mood%", SkypeUser.Users[Convert.ToInt32(ID[1])].Mood);
    body=body.Replace("%about%", SkypeUser.Users[Convert.ToInt32(ID[1])].About);

    if(!(body==String.Empty)) {
        skype.SendMessage(SkypeUser.Users[Convert.ToInt32(ID[1])].Handle, body);
    }
}

如果我选择三个人,分别是 Jim、Tim 和 Derp,那么所选列表中的第一个人就是 Jim。如果我使用%name%,它将在给 Jim 的消息中正确地替换为“Jim”,但给 Tim 和 Derp 的消息也将包含“Jim”,而不是用字符串将 %name% 替换为他们的名字。


编辑:

我知道将valuebody 和 if 语句放在循环中;但我希望只需要输入一次消息。这就是大众信息的全部意义所在。

【问题讨论】:

  • 在这种情况下,您可以使用临时变量,该变量每次都会被分配给 body.. 还有另一种解决方案,但它需要更多的努力。您可以保持代码原样,并且可以使用 RegularExpression.replace() 并将替换的值放入另一个字符串中,而不是将其放入变量“body”中...

标签: c# string replace


【解决方案1】:

以下语句应在 for 循环内。

            string value = "Hi %name%!";
            string body = "";
            if (Program.InputBox("New Message", "Body of the message:", ref value) == DialogResult.OK)
            {
                body = value;
            }

【讨论】:

  • 阅读我的编辑。我知道这是一个修复,但它不是我的解决方案的修复。
  • 是的,我在您编辑后为您的解决方案添加了评论:) 快乐编码
【解决方案2】:

第一次执行循环时,%% 占位符被有效销毁。如果你进去:

body = "Hi %name%";

第一次迭代后你得到:

body = "Hi Jim";

当循环第二次运行时,它在“Hi Jim”中搜索%name%,没有找到要替换的内容,只留下字符串,最终将“Hi Jim”发送给 Derp。避免修改 body 的原始值,并在每次迭代中使用新的变量:

foreach (ListViewItem i in listView2.SelectedItems)
{
   string userBody = body;
   ...
   userBody = userBody.Replace("%name%", SkypeUser.Users[Convert.ToInt32(ID[1])].Name);
   ...
}

还要注意,C# 中的string 类是不可变的,这意味着循环中的每个字符串操作都会创建一个具有修改内容的字符串的新实例,并将之前的值作为垃圾回收。如果您进行重要的字符串操作(并且您确实这样做了),请查看 StringBuilder 类,该类旨在用于字符串操作。你的代码看起来有点像:

foreach (ListViewItem i in listView2.SelectedItems)
{
   StringBuilder userBodyBuilder = new StringBuilder(body);
   ...
   userBodyBuilder.Replace("%name%", SkypeUser.Users[Convert.ToInt32(ID[1])].Name);
   ...
}

此代码将大大减少内存浪费,并且比您的原始代码更快,因此您将能够更有效地向您的联系人发送垃圾邮件:D

【讨论】:

    【解决方案3】:

    我认为第一次替换数据%XXX%(例如"%name%")时,下一次传入循环时,您将不再拥有它们。

    在循环中使用新变量:

    foreach[...]
    {
      string currentBody = body;
      currentBody = body.Replace[...]
      [...]
    }
    

    【讨论】:

      【解决方案4】:

      发送消息后再次替换字符串

      易于复制的代码

      if(SkypeUser.Users[Convert.ToInt32(ID[1])].Handle!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].Handle, "%handle%");
      }
      
      if(SkypeUser.Users[Convert.ToInt32(ID[1])].Name!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].Name, "%name%");
      }
      
      if(SkypeUser.Users[Convert.ToInt32(ID[1])].Status!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].Status, "%status%");
      }
      
      if(SkypeUser.Users[Convert.ToInt32(ID[1])].Country!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].Country, "%country%");
      }
      
      if(SkypeUser.Users[Convert.ToInt32(ID[1])].Mood!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].Mood, "%mood%");
      }
      
      if(SkypeUser.Users[Convert.ToInt32(ID[1])].About!=String.Empty) {
          body=body.Replace(SkypeUser.Users[Convert.ToInt32(ID[1])].About, "%about%");
      }
      

      【讨论】:

        【解决方案5】:

        那是因为您要替换循环中的字符串主体。在循环中创建一个临时变量并分配给它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 2017-04-07
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 2017-08-04
          相关资源
          最近更新 更多