Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用不同的值替换一个单词_C# - Fatal编程技术网

C# 用不同的值替换一个单词

C# 用不同的值替换一个单词,c#,C#,我有一个字符串“{Day}-是胜利的一天。{Day}-是我的生日” 如何用不同的数字替换{Day}?我尝试: string text = "{Day} - is a victory day. {Day} - is my birthday"; if (text.Contains("{Day}")) text = text.Replace("{Day}", xNet.Rand.Next(1, 30).ToString()); 但是两次替换的日期是相同的。发生这种情况是因为xNet.Rand

我有一个字符串“{Day}-是胜利的一天。{Day}-是我的生日”

如何用不同的数字替换{Day}?我尝试:

string text = "{Day} - is a victory day. {Day} - is my birthday";
if (text.Contains("{Day}"))
    text = text.Replace("{Day}", xNet.Rand.Next(1, 30).ToString());

但是两次替换的日期是相同的。

发生这种情况是因为
xNet.Rand.Next(1,30).ToString()
只被调用一次。也就是说,当触发
text.Replace(..)

要用不同的数字替换每个事件,可以执行以下操作:

string searchString = "{Day}";
int foundIndex = text.IndexOf(searchString);
while (foundIndex > -1)
{
  text = text.Substring(0, foundIndex) 
           + xNet.Rand.Next(1, 30).ToString() 
           + text.Substring(foundIndex + searchString.Length);
  foundIndex = text.IndexOf(searchString);
}

未经测试,但这将为您提供解决方法的线索。

String.Replace
将字符串作为“Replace with”参数,并用该参数替换所有出现的字符串。例如,在您的情况下,Rand可能会生成一次字符串
19
,然后将该字符串传递给Replace,并将替换所有出现的
{Day}

如果您希望它为每个匹配生成一个新的替换,您可以使用
Regex.Replace
,它可以使用一个函数/lambda,该函数在每个匹配中调用一次以生成替换字符串

text = Regex.Replace(text, Regex.Escape("{Day}"),
        match => xNet.Rand.Next(1,30).ToString());

使用
Regex。将
替换为
MatchEvaluator
委托:

string text = "{Day} - is a victory day. {Day} - is my birthday";
text = Regex.Replace(text, @"\{Day\}", m => xNet.Rand.Next(1, 30).ToString());
根据相关(String.Replace)MSDN条目:

返回一个新字符串,其中指定的 当前字符串中的Unicode字符或字符串替换为 另一个指定的Unicode字符或字符串

请注意,它将替换所有发生的事件。在当前代码中,您正在使用相同的随机生成值替换这两个事件

两种可能的解决办法:

  • 将原始字符串拆分为两个:替换第一个字符串中的值,然后替换第二个字符串中的值:然后再次连接这两个字符串
  • 将第一个{Day}参数重命名为,例如,{Day0};第二个是{Day1}。然后为每一个生成一个随机值

是,因为
Rand.Next
只计算一次,所以相同的值将被替换

您可以使用正则表达式或手动执行:

string text = "{Day} - is a victory day. {Day} - is my birthday";
var sb = new StringBuilder(text);
while (text.Contains("{Day}"))
{
  int p=text.IndexOf("{Day}");
  sb.Remove(p,5);
  sb.Insert(p, xNet.Rand.Next(1, 30).ToString());
  text = sb.ToString();
}

这可能不是做你想做的事情的最佳方式。。。但您至少需要了解,您只调用了一次
text.Replace()
方法,并且它可以按预期工作。即,用方法生成的数字替换
{Day}
的每个实例。如果希望它们是两个不同的值,则需要替换两个不同的值

    string text = "{Day} - is a victory day.  {Day2} - is my birthday";
    text = text.Replace("{Day}", xNet.Rand.Next(1, 30).ToString());
    text = text.Replace("{Day2}", xNet.Rand.Next(1, 30).ToString());

什么是xNet.Rand?如果它每次都创建一个新的
随机
,那么这就是你的问题。你需要一个接一个地替换它们,就像这样他们基本上说的
Rand.Next()
只执行一次,他们希望每次
{Day}都执行一次
@MikeChristensen很抱歉我的英语不好,但是谁是
他们
?@I4V-发布这个问题的人。P.S。我意识到这太草率了。。。只是想把答案放在问题的上下文中。这也是草率的;)