C#使用Replace方法实现字符串首尾字符互换结果异常原因排查
问题背景
我了解string是不可变类型,为了加深对该特性的理解尝试操作字符串,未得到预期结果,具体情况如下:
需求
- 给定初始字符串
string stringToUpdate = "abcd" - 第一步:将字符串的第一个字符替换为最后一个字符,预期得到中间结果
dbcd - 第二步:将第一步得到的字符串的最后一个字符替换为原字符串的第一个字符,最终预期得到首尾互换的结果
dbca
实际运行代码后得到的结果是 abca,仅最后一个字符替换成功,第一个字符未发生替换,想要知道如下代码的问题所在:
public void StringReplace() { var stringToUpdate = "abcd"; char firstString = '\0'; char lastString = '\0'; for (int i = 0; i <= stringToUpdate.Length; i++) { if (i == 0) { firstString = stringToUpdate[0]; } if (i == stringToUpdate.Length - 1) { lastString = stringToUpdate[i]; } } var newString = stringToUpdate.Replace(firstString, lastString); //newString赋值后为dbcd,第一步替换生效 var finalString = newString.Replace(lastString, firstString); Console.WriteLine(finalString); }
问题原因
string.Replace() 方法的作用是替换字符串中所有匹配的指定字符/子串,而非按指定索引位置替换单个字符。
上述代码的实际执行流程如下:
- 第一步替换:将原字符串中所有
a替换为d,原字符串仅首字符为a,因此得到中间结果dbcd,和预期一致 - 第二步替换:将中间结果
dbcd中所有d替换为a,此时字符串的首字符和尾字符都是d,二者都会被替换,最终得到结果abca,和实际运行结果一致
正确实现方案
如果要实现指定位置的字符替换,可以通过Remove加Insert的组合实现,示例代码如下:
// 替换首字符为原尾字符 var newString= stringToUpdate.Remove(0, 1) .Insert(0,lastString.ToString()); // 替换尾字符为原首字符 var finalChange=newString.Remove(newString.Length-1,1) .Insert(newString.Length-1,firstString.ToString());
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

