C# 循环期间未替换的字符串

C# 循环期间未替换的字符串,c#,string,replace,C#,String,Replace,我正在为一个skype机器人做一个消息循环,这意味着我可以很容易地做广告/群发消息。但是,在循环中的第一个名称字符串被类中的名称替换后,它将只使用该名称,而不会在下一个循环中替换新名称 代码: if(listView2.SelectedItems.Count<=0) return; string value="Hi %name%!"; string body=""; if(Program.InputBox("New Message", "Body of the message:

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

代码:

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

if(listView2.SelectedItems.Count)下面的语句应该在for循环中

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

这是因为您正在替换循环中的字符串体。请在循环中创建一个临时变量并分配给该变量。

第一次执行循环时,
%%
占位符将被有效地销毁。如果使用:

body = "Hi %name%";
在第一次迭代之后,您会得到:

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

foreach (ListViewItem i in listView2.SelectedItems)
{
   string userBody = body;
   ...
   userBody = userBody.Replace("%name%", SkypeUser.Users[Convert.ToInt32(ID[1])].Name);
   ...
}
还要注意,C#中的
string
类是不可变的,这意味着循环中的每个字符串操作都会创建一个包含修改内容的字符串的新实例,并将以前的值作为垃圾保留以进行收集查看设计用于字符串操作的类。您的代码看起来有点像:

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

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

我认为,第一次替换数据
%XXX%
%name%”
)时,下一次通过循环时,您将不再拥有这些联系人

在循环中使用新变量:

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

只需在发送消息后再次替换字符串。在这种情况下,您可以使用临时变量,该变量将在每次使用body时被赋值。还有一个解决方案,但它需要更多的努力。您可以保持代码的原样,并可以使用RegularExpression.replace()将替换的值放在另一个字符串中,而不是放在变量“body”中…请阅读我的编辑。我知道这是一个固定值,但它不是我的解决方案的固定值。是的,在您编辑该值后,我在您的解决方案中添加了一条注释:)快乐编码
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%");
}